#define 可以在预处理中处理算术运算吗?

Can #define process arithmetic operations in preprocessing?

C宏#define可以在预处理中处理算术运算吗?

例如,如果我写

#define A 1 + 1

会不会被预处理等同于

#define A 2

在编译之前?

此外,是否可以通过这种方式定义常量而无需计算开销:

#define A 1
#define B A + 1
#define C B + 1
...

?

宏是文本替换(标记替换更准确)。

#define A 1 + 1
int main() { printf("%d\n", A); }

将扩展为(运行 gcc -E 在源上获得预处理器扩展)

int main() { printf("%d\n", 1 + 1); }

(顺便说一句,这就是为什么在宏 (#define A (1+1)) 中大量使用括号是明智的,因为 你通常希望 A*3 成为 6 ( (1+1)*3 ) 而不是 4 ( 1+1*3) )).

是的 1+1,因为它满足整数常量表达式的标准规则,几乎可以保证在编译时进行处理,因此您可以在需要整数常量表达式的上下文中使用它.

例如:

 #define A (1+1)
 extern char  array[A] = { [A-1]='c' } ; //ICE required
 struct s { int bitfield:A; }; //ICE required
 enum { a = A }; //ICE required
 int x = A; //ICE required
 int main ()
 {
    switch(1) case A: puts("unreachable"); //ICE required
 }