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