C语言中符号常量和宏的区别是什么?

3
我只能看出相似之处,而无法看出区别...
2个回答

8
一个宏(Macro)带有参数并且(通常)生成实际代码,而一个#defined的常量仅仅是一个值:
例如:
#define MAX_NAME_LENGTH 32

对比

#define MAX(a, b)   ((a) > (b) ? (a) : (b))

当然,如果可能的话,最好使用实际的语言级常量:
enum {
 MAX_NAME_LENGTH = 32
}

或者

const size_t MAX_NAME_LENGTH = 32;

这些提供了更好的可测试性,通常与调试器配合使用效果更好(因为它们是适当的一级符号),并且不依赖于文本替换技术。


但请记住,const 并不意味着将某些内容作为编译时常量。例如,您不能使用它来声明静态分配数组的大小。 - detly
1
MAX_NAME_LENGTH 也是一个宏(macro)。(它不是一个类似函数的宏。)我认为更好的描述应该是宏实际上只是文本替换。 - jamesdlin

0

C语言中的常量(你问过这个问题)是数字常量(0、1、0x0、0.1、1.E-10等)、整数字符常量('a'、'\n'、L'A'等)和枚举常量(它们的类型为int!)。因此,后者是唯一可以由程序定义的。

const属性限定的变量在C语言中不是常量的意义。(最好将const读作unmutableinvariant

宏只是在预处理阶段进行的文本替换。通常标准库头文件包含宏,这些宏会扩展到相应系统的适当常量。例如:NULLfalsetrueINT_MAXCHAR_BIT等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接