![]() |
1
4
这些不是“内存定义”。它们是预处理器宏。编译器本身没有它们的可见性,因为它们在运行之前都被替换了(本质上是通过复制和粘贴)。 |
![]() |
2
2
所有这些具有
预处理器是一种软件,在编译器处理所有代码文件之前,它会对所有代码文件进行检查。预处理器在文件中搜索特殊命令,称为预处理器指令。一旦找到指令,预处理器就会对代码文件执行一些操作。编译器只能编译对原始代码文件进行预处理的结果。
例如,当预处理器遇到
告诉预处理器替换
一旦被编译器处理
|
![]() |
3
2
在调用编译器之前,宏将被定义为所代表的字符序列所取代。也就是说,你的宏甚至不是“十六进制值”。它们代表没有语言级语义的字符序列。
替换后,编译器将看到这些字符序列,并根据周围的上下文进行相应的解释。在“典型”情况下,编译器会将它们解释为
整数常量
。整数常量为
右值
在C中,它们没有与它们相关联的内存。从概念上讲,它们不存在于记忆中。这并不意味着他们
不打字的
虽然在C语言中,常量的格式定义了它的类型。
但是,替换序列的语义可能(也将)取决于它所处的上下文。如果愿意,您可以将这些宏“实例化”为字符串文字,或者将它们与其他字符序列连接,从而完全改变它们的含义。 |
![]() |
Timo · 如果宏变量后跟构成有效标识符的字符,则不会展开宏变量 6 年前 |
![]() |
user3623498 · 在#if中更改变量时出现问题 6 年前 |
![]() |
einpoklum · 来自#cmakedefine替换的意外结果 7 年前 |
![]() |
Joseph Franciscus · C中预处理器方法的别名++ 7 年前 |
![]() |
stoper · 防止同一宏在多个转换单元中具有不同的定义 7 年前 |
![]() |
СеÑгей · MinGW中预处理器g++的奇怪行为 7 年前 |