c语言中const对于define优点,为什么大多数C开发人员使用define而不是const?
这有一个非常可靠的原因: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?相关推荐
- c语言中mw shl code,cacoshl - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
在头文件中定义float complex cacoshf( float complex z );(1)(since C99) double complex cacosh( dou ...
- 在c语言中void是什么,C语言中void是什么意义?_后端开发
C言语中void是什么意义? C言语中"void"示意为无范例,响应的"void *"为无范例指针,常用在程序编写中对定义函数的参数范例.返回值.函数中指针范例 ...
- c语言中的if语句_If ... C中的其他语句解释
c语言中的if语句 Conditional code flow is the ability to change the way a piece of code behaves based on ce ...
- c语言putchar与getchar,C语言中的getchar和putchar详解
首先给出<The_C_Programming_Language>这本书中的例子: #include int main() { int c; c = getchar(); while (c ...
- C语言中定义常量的关键字是什么,C++_详解C语言中const关键字的用法,关键字const用来定义常量,如 - phpStudy...
详解C语言中const关键字的用法 关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const ...
- C语言中const的用法
C语言中const的用法 基本解释 const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解co ...
- const在c语言中作用,在C语言中const作用全面总结.doc
在C语言中const作用全面总结 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助.Const 是C++中常 ...
- char* 赋值 const char* 释放_C/C++编程笔记:C语言中 const 关键字的作用及解析,值得收藏!...
有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小. 为了满足这一要求,可以使用const关键字对变量加以限定: c ...
- c语言 编译开关用法,C语言中define的使用方法
C语言中define的使用方法 学习了这么多年C语言,说实话对宏自以为了如指掌了,没想到看内核代码的时候还是那么吃力,设备驱动代码中有很多这样或者那样的宏定义,各种define都有哪些学习方法呢?以下 ...
最新文章
- 可持久化线段树(主席树)【舰娘系列】【自编题】
- 远哥谈 使用WebSocket开发在线实时看远程服务器log日志的工具
- Linux 搭建SVN 服务器
- 李永乐线性代数手写笔记-行列式与矩阵
- JS和JQUERY的区别
- MAT之ELM:ELM基于近红外光谱的汽油测试集辛烷值含量预测结果对比
- 不会跳回到微博认定申请书
- 博文视点 OpenParty第11期:世界黑客大会那些事
- 在域环境下搭建samba服务器
- 阿里敏捷教练:多团队开发一个产品的组织设计和思考
- ais信号接收设备_基于USRP的AIS接收机实现
- 80%的前端程序员都遇到的问题,你中招了吗?
- 【Java程序设计】类与对象的基本概念(上)
- size_t_百度百科
- linux NFS 配置步骤
- 学习笔记(1):机器学习数学基础之凸优化视频教学-(1.2)机器学习中的优化问题及实例...
- 了解“黑马程序员”有感
- react native与夜神模拟器结合使用运行安卓平台
- 大巧不工Web前端设计修炼之道——(8)浅谈Web发展的未来
- 十几套IT培训视频教程免费下载,为你节省几万元培训费用
热门文章
- HTML和css学术报告,清华大学 张超 副教授访问我院并做学术报告
- android保存字符到sd卡,android 保存TXT文件到SD卡方法
- Linux centos7 安装 MySQL5.7.x
- ant-design-vue 环境搭建及入门
- java递归老鼠走迷宫_递归算法求老鼠走迷宫(C语言)
- 编写一个C程序,实现以下功能:动态申请长度为5的整数空间数组,用户输入5个整数;动态扩展数组空间为8,用户另外输入3个整数,最后输出扩展后的全部数组元素。
- python模拟猫狗大战_tensorflow实现猫狗大战(分类算法)-阿里云开发者社区
- python xml etree word_使用python格式化插入的元素xml.etree模块,包括新行
- python输入一个整数列表 列表元素为18_Python-18 (高级变量1--列表)
- java 提取轮廓_TensorFlow 卷积操作模拟sobel算子提取图像轮廓