C语言中宏常量和常量变量有什么区别?

23
4个回答

42

宏由预处理器处理 - 预处理器在源文件中执行文本替换,将所有出现的 'A' 替换为字面值 8。

常量由编译器处理。它们具有类型安全的附加优势。

对于实际编译后的代码,在任何现代编译器中,两者之间应该没有性能差异。


2
非常感谢您的清晰解释。两者之间不应该有任何性能差异。我之前在一本可怕的书中读到,后者比使用宏要慢。 - Rüppell's Vulture
4
有时使用宏可能会增加目标文件的大小。假设您在宏中存储了一个非常大的字符串,在编译之前,预处理器将替换该字符串的所有出现次数为其值,从而导致生成比较大的目标文件。 - shashwat

11

宏定义的常量会被预处理器替换。常量“变量”与普通变量一样进行管理。

例如,以下代码:

#define A 8
int b = A + 10;

对于实际的编译器来说,看起来是这样的

int b = 8 + 10;

然而,这段代码:

const int A = 8;
int b = A + 10;

将显示为:

const int A = 8;
int b = A + 10;

实际上,主要的变化在于作用域:常量变量遵循C语言标准变量相同的作用域规则,这意味着它们可以在特定的块内部受限或可能被重新定义,而不会泄漏出来 - 这类似于局部变量和全局变量的情况。


6
在 C 语言中,您可以编写:
#define A 8
int arr[A];

但不包括:

const int A = 8;
int arr[A];

如果我回忆得没有错的话,注意在C++中两种方法都可以工作。


2
@Michael:不行,至少在使用gcc时不行。“foo.c:2: error: variably modified ‘arr’ at file scope” - swegi
3
没错,我漏掉了问题上的C标签。我说的话适用于C++。 - Michael

2
一方面,第一个会导致预处理器在编译器执行任何操作之前将所有A的出现替换为8,而第二个则不涉及预处理器。

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