Может ли #define обрабатывать арифметические операции при предварительной обработке? - PullRequest
0 голосов
/ 21 октября 2018

Может ли макрос C #define обрабатывать арифметические операции при предварительной обработке?

Например, если я напишу

#define A 1 + 1

, будет ли он предварительно обработан, чтобы быть эквивалентным

#define A 2

перед компиляцией?

Кроме того, возможно ли определить константы таким образом без затрат на вычисления:

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

?

1 Ответ

0 голосов
/ 21 октября 2018

Макросы - это текстовые замены (точнее, замены токенов).

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