KEIL C51中const和code的使用

  code是KEIL C51 扩展的关键字,用code修饰的变量将会被放到CODE区里。但C语里的const关键字好像也有定义不能改变的变量的功能,这两个关键字有什么区别呢?
在帮助手册里查找const,可以找到以下的描述
1 Variables declared with the const type qualifier alone are stored in the memory area (data, idata, xdata, and so on) associated with their definition. 
2 Variables you want to locate in ROM must be declared with the code memory type.
意思应该是:用CONST修饰修饰的变量放在RAM里了,但你不能改它。用CODE修饰符修饰的变量放在FLASH里了

it is possible to assign the address of a const object (mask) to a non-const pointer (p) and subsequently use the pointer to change the const object. In this case, the compiler does generate code to write to the const object. The effects of this code is undefined and may or may not work as expected
  可以用一个非COSNT的指针指向一个CONST变量,并且可以使用这个指针指向的变量。编译器不会产生错误,但此时程序的运行结果是不可以预测的。
  根据上面说的,const关键字在C51里的作用是弱的,所以基上应该用不到。不止是C51,一般的C也一样。可以试一下,这个程序半个警告都没有,但是运行结果是1。

#include <stdio.h> #include <stdlib.h> int main(void) { const int a = 2; int *p; p = (int *)(&a); *p = 1; printf("%d\n", a); return 0; }

因为最后,a的值是存储在内存中的。内存有办法直接修改,同时更改内存不超出本程序的内存范围(不然被操作系统杀死),自然可行。
其实想一个简单的道理:以前用FPE之类的东西改游戏,别人源程序里有没有const我们没注意过吧,其实也不可能知道,甚至连别人的源程序是什么语言写的也都没关系。因为只要是目标程序内存里的量,一概可以改,别的一概不论。

  其实在我的编译器上(GCC/mingw),就不用说用指针了,就算直接写a=1都能成功把a改掉。但是这样就会有个大warning报警,可以发现。
      const的约束是建议性的,只是一种防止意外写出“constvar = 1;”这类错误赋值的提示手段。const很有用,但不是保证变量不被改的方法。
  而code是硬件实现的,防改性能自然OK。不过考虑到编程习惯,我建议:见到code,一律写成const code。明确表意,防止写出意外的赋值出错。

时间: 2024-11-15 13:34:46

KEIL C51中const和code的使用的相关文章

[51单片机] Keil C51中变量的使用方法详解

引言    8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同.正确地使用变量,有利于获得高效的目标代码.下面详细介绍Keil C51中变量的使用方法. 1 CPU存储结构与变量的关系    变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同.    标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CP

Keil C51程序设计中几种精确延时方法

单片机因具有体积小.功能强.成本低以及便于实现分布式控制而有非常广泛的应用领域[1].单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖.数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒.有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作.用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3].因此,在多年单片机开发经验

KEIL C51程序中如何嵌入汇编

模块内接口:使用如下标志符:#pragma asm汇编语句#pragma endasm注意:如果在c51程序中使用了汇编语言,注意在Keil编译器中需要激活Properties中的“Generate Assembler SRC File” 和“Assembler SRC File ”两个选项1.把"xx.c"加入工程中,右击"xx.c"选择“options for file"xx.c" 选择“Generate Assembler SRC File

C51中的关键字和ANSIC标准关键字

C51中的关键字和ANSIC标准关键字 作       者:武力戡乱 修改日期:2017-09-05 备       注: 1.总备注信息 2.联系方式 3.其它博文链接:武力戡乱博客目录总表 内       容: 1.C51中的关键字 关键字 用 途 说 明 auto 存储种类说明 用以说明局部变量,缺省值为此 break 程序语句 退出最内层循环 case 程序语句 Switch语句中的选择项 char 数据类型说明 单字节整型数或字符型数据 const 存储类型说明 在程序执行过程中不可更

C++类中const一些用法

在类中的const基本有三种用法 const int func(); // 返回值是const类型 int func(const int); // 参数为const类型 int func(int )const; // 为const类型的成员函数,只能调用类中const类型的变量: 另外,当类的实例是const类型时,也只能调用类中的const成员函数,且只有类的成员函数才能被修饰为const类型: //Point.h #include <iostream> using namespace st

keil c51 和keil mak(arm)如何安装在一起的问题

这问题是我最近遇到的,刚开始卸来卸去很麻烦.在网上搜的方法也不好用,就想想搞了一下能行. 言归正传: 准备:keil 4 c51 和 keil 4 arm两个安装包和一个注册机(我用的两个都是keil4的): 安装:[1]在e盘(我win8.1)j建两个文件夹,(我取的名字“keil4c51”和“keil4arm”): [2]安装keil c51到建的文件夹里(不多说):安装keil mdk到另外的一个文件夹里,都不用破解(先==):   [3]把keil4c51文件夹里的c51文件夹复制到ke

C与C++中const区别

一.C中的const,功能比较单一,较容易理解. · 作用      : 被修饰的内容不可更改. · 使用场合: 修饰变量,函数参数,返回值等.(c++中应用场合要丰富的多) · 特点      : 是运行时const,因此不能取代#define用于成为数组长度等需要编译时常量的情况.同时因为是运行时const,可以只定义而不初始化,而在运行时初始化.如 const int iConst;. 另外,在c中,const变量默认是外部链接,因此在不同的编译单元中如果有同名const变量,会引发命名冲

Keil C51汉字显示的bug问题

一.缘起 这两天改进MCU的液晶显示方法,采用“即编即显”的思路,编写了一个可以直接显示字符串的程序.如程序调用disstr("我是你老爸");液晶屏上就会显示“我是你老爸”. 二.问题 但是,花了1天多时间辛辛苦苦改好的程序后,却发现有些汉字显示有问题.比如: P1:在第一行显示“实时参数”,第二行显示“工作状态”,实际上“工作状态”却重复显示了,除了在正确的地方显示外,还在“实时参数”后显示了. P2:"正"字后若有":",则都显示成乱码.如

keil c51的内部RAM(idata)动态内存管理程序(转)

源:keil c51的内部RAM(idata)动态内存管理程序 程序比较简单,但感觉比较有意思,个人认为有一定应用价值,希望大家有更好的思路和方法,互相促进. 程序的基本思路是:在CPU堆栈指针SP以上的RAM区域,通过把堆栈指针SP上移若干个字节,把空出的RAM区域供用户使用,当用户在使用完后又可以把该RAM区域释放. 头文件dmalloc51.h /* **********************************************************************