首页 > 试题广场 >

下列关于const和#define定义常量的区别,说法不正确

[单选题]
下列关于const和#define定义常量的区别,说法不正确的有()
  • define宏是在预处理阶段展开。const常量是编译运行阶段使用
  • 宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查
  • define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(可以是堆中也可以是栈中)
  • const定义和#define定义的常量在程序运行过程中只有一份拷贝
[解析]
A,正确,#define定义的宏是在预处理阶段进行替换的,const常量是在编译、运行阶段进行使用的。
注意是仅仅的字符串替换,并不会检查其合法性。
预处理阶段做了的任务:
1:将头文件中的内容(源文件之外的文件)插入到源文件中
2:进行了宏替换的过程(简单的字符串替换),定义和替换了由#define指令定义的符号
3:删除掉注释的过程,注释是不会带入到编译阶段
4:条件编译
B,正确,所有的宏替换只是简单的字符串替换,注意是字符串替换,所以并不会检查其合法性,而const定义的常量依然是内置类型等,所以会对其进行类型安全检查。
C,正确,宏定义在程序中使用了几次在预处理阶段就会被展开几次,并不会增加内存占用,但是宏定义每展开一次,代码的长度就要发生变化(所以有利必有弊啊!),而const常量也会为其分配内存(如果是动态申请空间肯定就是堆中了)。
D,错误,const定义的常量只有一次拷贝没毛病,而define定义的变量在内存中并没有拷贝,因为所有的预处理指令都在预处理时进行了替换。
编辑于 2018-09-09 14:09:28 回复(5)
#define在预处理阶段就替换了,而不是拷贝
发表于 2022-06-02 21:37:22 回复(0)
const 只是只读的变量,加上它之后,编译器看到它,会认为认定该变量是只读的,该变量就成了只读变量了。但是也可以通过指针去改变。所以该变量也可以在堆上或者栈上。define定义的变量在内存中并没有拷贝,因为所有的预处理指令都在预处理时进行了替换
编辑于 2021-02-02 17:37:13 回复(1)

虽然 const 定义的常量和 #define 定义的常量都是常量,但它们的实现方式不同,会导致常量在内存中的存储方式也不同。

对于 #define,编译器在编译时会简单地将所有用到该常量的地方替换成该常量的值。这意味着 #define 宏定义的常量在内存中并没有单独的存储空间,而是直接替换成其具体的值。

而对于 const 常量,编译器会为其分配内存,并在程序运行时将其作为常量存储在内存中。每个使用该 const 常量的地方都会指向同一份内存。因此,const 常量在程序运行过程中可能会存在多份拷贝。

所以说选项D "const定义和#define定义的常量在程序运行过程中只有一份拷贝" 的说法是不正确的。

其他选项,包括A、B和C,都是正确的说法。#define 定义的常量是在预处理阶段展开,而 const 常量是在编译运行阶段使用。#define 与 const 的类型检查和内存分配方式也有所不同。

发表于 2023-10-31 09:27:42 回复(0)
宏定义那不是占了代码段的内存了吗,为什么叫没分配内存
发表于 2022-07-03 17:43:14 回复(0)