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

erk*_*gur 18 c constants c-preprocessor

可能重复:C中的
"static const"vs"#define"

我开始学习C并且无法清楚地理解宏和常量变量之间的差异.

我写的时候有什么变化

#define A 8
Run Code Online (Sandbox Code Playgroud)

const int A = 8
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 28

宏由预处理器处理 - 预处理器在源文件中进行文本替换,用文字8替换所有出现的'A'.

常量由编译器处理.它们具有类型安全性的额外好处.

对于实际编译的代码,使用任何现代编译器,两者之间应该没有性能差异.

  • ` 两者之间的性能差异应该为零`--感谢您说得如此清楚。在我读到一本糟糕的书之前,我说后者比使用宏慢。 (2认同)
  • 但是有时使用宏会增加目标文件的大小。假设您有一个很大的字符串存储在宏中,则预处理器将在编译之前用该字符串的值替换所有出现的字符串,从而导致目标文件相对较大。 (2认同)

Luc*_*nes 7

宏定义的常量由预处理器替换.常量'变量'的管理方式与常规变量一样.

例如,以下代码:

#define A 8
int b = A + 10;
Run Code Online (Sandbox Code Playgroud)

将实际编译器看作是

int b = 8 + 10;
Run Code Online (Sandbox Code Playgroud)

但是,这段代码:

const int A = 8;
int b = A + 10;
Run Code Online (Sandbox Code Playgroud)

会显示为:

const int A = 8;
int b = A + 10;
Run Code Online (Sandbox Code Playgroud)

:)

在实践中,主要的变化是范围:常量变量遵循与C中的标准变量相同的范围规则,这意味着它们可以在特定块内受到限制或可能被重新定义,而不会泄漏 - 它类似于本地与全局变量情况.


swe*_*egi 6

在C中,你可以写

#define A 8
int arr[A];
Run Code Online (Sandbox Code Playgroud)

但不是:

const int A = 8;
int arr[A];
Run Code Online (Sandbox Code Playgroud)

如果我没记错规则的话。请注意,在 C++ 上,两者都可以工作。

  • 你是对的。我错过了这个问题的 C 标签。我所说的也适用于 C++。 (3认同)
  • @Michael:不,至少在使用 gcc 时不会。“foo.c:2:错误:在文件范围内可变地修改了‘arr’” (2认同)