这有一个非常可靠的原因:C中的const并不意味着一些常量。 这只是意味着一个variables是只读的。

在编译器需要一个常量的地方(例如非VLA数组的数组大小),使用constvariables(如fieldWidth是不可能的。

他们不一样

const只是一个限定符,它表示一个variables在运行时不能被改变。 但variables的所有其他function仍然存在:已经分配了存储空间,并且可以解决此存储空间问题。 因此,代码不仅仅把它当作一个文字来对待,而是通过访问指定的内存位置来引用variables(除非它是static const ,那么它可以被优化掉),并且在运行时加载它的值。 而作为一个constvariables已经分配了存储空间,如果你把它添加到一个头文件中,并将它包含在几个C源代码中,除非将其标记为extern否则将会出现“多符号定义”链接错误。 在这种情况下,编译器无法根据实际值优化代码(除非进行全局优化)。

#define只是用它的值replace一个名字。 此外,可以在预处理器中使用#ifdef常量:可以使用#ifdef根据其值进行条件编译,也可以使用string化运算符#来获取string的值。 而且由于编译器在编译时知道它的值,所以可以根据这个值优化代码。

例如:

#define SCALE 1 ... scaled_x = x * SCALE;

当SCALE被定义为1 ,编译器可以消除乘法,因为它知道x * 1 == x ,但是如果SCALE是( extern ) const ,则需要生成代码来获取值并执行乘法,因为值直到连接阶段才会知道。 ( extern需要使用来自多个源文件的常量。)

更接近于使用#define使用枚举:

enum dummy_enum { constant_value = 10010 };

但是这只限于整数值,并没有#define优点,所以没有被广泛的使用。

当你需要从编译它的某个库中导入一个常量值的时候, const是很有用的,或者如果它和指针一起使用的话。 或者,如果它是通过variables索引值访问的常量值数组。 否则, const比#define没有任何优势。

原因是大多数时候,你想要一个常量,而不是一个const限定的variables。 在C语言中,这两者并不是相同的。 例如,variables作为static持续时间对象的初始值设定项的一部分无效,例如非vla数组维度(例如结构中的数组大小或任何数组前C99)。

在R的答案稍微扩展一下: fieldWidth不是一个常量expression式 ; 这是一个const限定variables。 它的值直到运行时才build立,所以在需要编译时常量expression式的地方(比如在一个数组声明中,或者在一个switch语句中的一个case标签等),它不能被使用。

与预处理后扩展为常量expression式10的macrosFIELD_WIDTH比较; 这个值在编译时是已知的,所以它可以用于数组维度,案例标签等。

要添加到R.和Bart的答案:在C:枚举types常量中只有一种方法来定义符号编译时间常量。 这个标准规定这些是inttypes的。 我个人会写你的例子

enum { fieldWidth = 10 };

但是我觉得C程序员的口味差别很大。

虽然const int并不总是合适的,但是如果你定义了一个整型值,枚举通常会作为#define的替代。 这实际上是我在这种情况下的首选。

enum { FIELD_WIDTH = 16384 }; char buf[FIELD_WIDTH];

在C ++中,这是一个巨大的优势,因为您可以将枚举的范围限定在类或名称空间中,而不能将范围定义为#define。

在C中,你没有命名空间,也不能在一个结构体内枚举枚举的范围,甚至不能确定你的types是否安全,所以我实际上看不到任何主要的优点,尽pipe也许有些C程序员会指出。

根据K&R(第2版,第211页),“const和volatile属性是ANSI标准新增的”。 这可能意味着真正旧的ANSI代码根本就没有这些关键字,这实际上只是一个传统问题。 此外,它表示,编译器应该检测到更改constvariables的尝试,但除此之外可能会忽略这些限定符。 我认为这意味着一些编译器可能不会优化包含constvariables的代码,以便在机器代码中表示为中间值(就像#define一样),这可能会花费额外的时间访问远端内存并影响性能。

一些C编译器会将所有constvariables存储在二进制文件中,如果准备大量的系数可以在embedded式世界中占用大量的空间。

相反:使用const允许在现有的程序上闪烁来改变特定的参数。

在C中定义数字常量的最好方法是使用枚举 。 阅读K&R的The C Programming Language,第39页的相应章节。

c语言中const对于define优点,为什么大多数C开发人员使用define而不是const?相关推荐

  1. c语言中mw shl code,cacoshl - [ C语言中文开发手册 ] - 在线原生手册 - php中文网

    在头文件中定义float complex       cacoshf( float complex z );(1)(since C99) double complex      cacosh( dou ...

  2. 在c语言中void是什么,C语言中void是什么意义?_后端开发

    C言语中void是什么意义? C言语中"void"示意为无范例,响应的"void *"为无范例指针,常用在程序编写中对定义函数的参数范例.返回值.函数中指针范例 ...

  3. c语言中的if语句_If ... C中的其他语句解释

    c语言中的if语句 Conditional code flow is the ability to change the way a piece of code behaves based on ce ...

  4. c语言putchar与getchar,C语言中的getchar和putchar详解

    首先给出<The_C_Programming_Language>这本书中的例子: #include int main() { int c; c = getchar(); while (c  ...

  5. C语言中定义常量的关键字是什么,C++_详解C语言中const关键字的用法,关键字const用来定义常量,如 - phpStudy...

    详解C语言中const关键字的用法 关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const ...

  6. C语言中const的用法

    C语言中const的用法 基本解释         const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解co ...

  7. const在c语言中作用,在C语言中const作用全面总结.doc

    在C语言中const作用全面总结 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助.Const 是C++中常 ...

  8. char* 赋值 const char* 释放_C/C++编程笔记:C语言中 const 关键字的作用及解析,值得收藏!...

    有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小. 为了满足这一要求,可以使用const关键字对变量加以限定: c ...

  9. c语言 编译开关用法,C语言中define的使用方法

    C语言中define的使用方法 学习了这么多年C语言,说实话对宏自以为了如指掌了,没想到看内核代码的时候还是那么吃力,设备驱动代码中有很多这样或者那样的宏定义,各种define都有哪些学习方法呢?以下 ...

最新文章

  1. 可持久化线段树(主席树)【舰娘系列】【自编题】
  2. 远哥谈 使用WebSocket开发在线实时看远程服务器log日志的工具
  3. Linux 搭建SVN 服务器
  4. 李永乐线性代数手写笔记-行列式与矩阵
  5. JS和JQUERY的区别
  6. MAT之ELM:ELM基于近红外光谱的汽油测试集辛烷值含量预测结果对比
  7. 不会跳回到微博认定申请书
  8. 博文视点 OpenParty第11期:世界黑客大会那些事
  9. 在域环境下搭建samba服务器
  10. 阿里敏捷教练:多团队开发一个产品的组织设计和思考
  11. ais信号接收设备_基于USRP的AIS接收机实现
  12. 80%的前端程序员都遇到的问题,你中招了吗?
  13. 【Java程序设计】类与对象的基本概念(上)
  14. size_t_百度百科
  15. linux NFS 配置步骤
  16. 学习笔记(1):机器学习数学基础之凸优化视频教学-(1.2)机器学习中的优化问题及实例...
  17. 了解“黑马程序员”有感
  18. react native与夜神模拟器结合使用运行安卓平台
  19. 大巧不工Web前端设计修炼之道——(8)浅谈Web发展的未来
  20. 十几套IT培训视频教程免费下载,为你节省几万元培训费用

热门文章

  1. HTML和css学术报告,清华大学 张超 副教授访问我院并做学术报告
  2. android保存字符到sd卡,android 保存TXT文件到SD卡方法
  3. Linux centos7 安装 MySQL5.7.x
  4. ant-design-vue 环境搭建及入门
  5. java递归老鼠走迷宫_递归算法求老鼠走迷宫(C语言)
  6. 编写一个C程序,实现以下功能:动态申请长度为5的整数空间数组,用户输入5个整数;动态扩展数组空间为8,用户另外输入3个整数,最后输出扩展后的全部数组元素。
  7. python模拟猫狗大战_tensorflow实现猫狗大战(分类算法)-阿里云开发者社区
  8. python xml etree word_使用python格式化插入的元素xml.etree模块,包括新行
  9. python输入一个整数列表 列表元素为18_Python-18 (高级变量1--列表)
  10. java 提取轮廓_TensorFlow 卷积操作模拟sobel算子提取图像轮廓