![]() |
1
2
启动编译器时,将(按顺序)执行以下阶段:
在 预处理 阶段,预处理器将例如用以下内容“替换”您的行:
然后:
最后:
事实上,预处理器不是很聪明,也不进一步。 在 代码生成 阶段,您的线路将被解释为:
因为代码生成器非常聪明。 |
![]() |
2
1
The C standard 要求使用 整数常量表达式 ,在这种情况下,需要在编译时对其进行完全评估。(唯一的例外是“可变长度数组”,这些数组必须是函数局部变量,并且“自动存储持续时间”不是静态分配的。) 因此,你的问题的一个答案是 你不用担心 . 如果你写信
在文件范围内,或者
但一个更有用的答案是,解释如何亲眼看到
这个算术表达式是
常数
表达式,如果它没有副作用,不进行任何函数调用,也不引用任何变量的值(即使它是
所以,以你为例,
在宏观扩张之后
方括号内的表达式没有副作用,不进行任何函数调用,不引用任何变量的值,也不执行任何浮点或指针运算,因此它是一个整型常量表达式,编译器需要在编译时对其求值。 相比之下,如果使用MAX的定义:
那么宏观扩张将产生
方括号内的表达式将进行函数调用,因此它不是整型常量表达式,甚至不是常量表达式,您将得到编译时错误。 (Fy,C++中的规则要复杂得多;如果你需要知道这个问题,请问一个新问题。) |
![]() |
3
0
宏总是在编译过程开始之前求值的。所以这段代码不用担心,应该可以正常工作。
同时,这整件事都依赖于编译器,我相信
|
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 3 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 4 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 4 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 4 月前 |