C宏#define
是否可以在预处理中处理算术运算?
例如,如果我写
#define A 1 + 1
将其预处理为等同于
#define A 2
在编译之前?
此外,是否可以通过这种方式定义常量而无需计算开销:
#define A 1
#define B A + 1
#define C B + 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
}