可以#define预处理中的过程算术运算吗?

时间:2018-10-21 09:53:10

标签: c macros c-preprocessor

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

例如,如果我写

#define A 1 + 1

将其预处理为等同于

#define A 2

在编译之前?

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

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

1 个答案:

答案 0 :(得分:3)

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

#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满足了整数常量表达式的标准规则,因此可以保证在编译时进行处理,因此可以在需要整数常量表达式的上下文中使用它。 / p>

例如:

 #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
 }