搜索
bottom↓
回复: 6

KEIL C51中const和code的使用

[复制链接]

出0入0汤圆

发表于 2011-11-13 14:09:00 | 显示全部楼层 |阅读模式
code关键字是KEIL C51 扩展的关键字,用些关键字修饰的变量将会被放到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里的作用是弱的,所以基上应该用不到。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2012-5-21 21:56:04 | 显示全部楼层
没有太明白也

出0入0汤圆

发表于 2012-5-23 00:23:28 | 显示全部楼层
code表示将数据存放实在flash中的,故只能读,和const一样都是表示常量。如可声明code const unsigned char cst = 0xaa;

出30入25汤圆

发表于 2012-5-23 01:50:35 | 显示全部楼层
不止是C51,一般的C也一样。可以试一下,这个程序半个警告都没有,但是运行结果是1。
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5.         const int a = 2;
  6.         int *p;
  7.         p = (int *)(&a);
  8.         *p = 1;
  9.         printf("%d\n", a);
  10.         return 0;
  11. }
复制代码
因为最后,a的值是存储在内存中的。内存有办法直接修改,同时更改内存不超出本程序的内存范围(不然被操作系统杀死),自然可行。
其实想一个简单的道理:以前用FPE之类的东西改游戏,别人源程序里有没有const我们没注意过吧,其实也不可能知道,甚至连别人的源程序是什么语言写的也都没关系。因为只要是目标程序内存里的量,一概可以改,别的一概不论。

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

而code是硬件实现的,防改性能自然OK。不过考虑到编程习惯,我建议:见到code,一律写成const code。明确表意,防止写出意外的赋值出错。

出0入0汤圆

发表于 2012-5-26 08:12:13 | 显示全部楼层
C语言认为Const关键字修饰的是个变量,虽然有个“常量”的名字。
用switch语句就能体会到了。

出0入0汤圆

发表于 2012-6-16 10:37:10 | 显示全部楼层
在C51 里,直接用code就可以了,const的好像没有什么用。

出0入0汤圆

发表于 2013-9-24 16:40:04 | 显示全部楼层
另一个建议:const 修饰的常量表可以放在ram中,code 修饰的常量表一定放在rom中。如果这个常量表经常用到可以用const修饰,从而提高效率,因为从ram读取比从rom快。如果这个常量表大且不经常用到可以用code修饰,放在rom中,可以节约内存。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 04:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表