Макросы - это текстовые замены (точнее, замены токенов).
#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
}