Ответ 1
Функциональный макрос FOO
#define FOO(x) ...
расширяется только тогда, когда появляется токен FOO
, за которым следует токен (
. Таким образом, чтобы предотвратить расширение FOO
, можно использовать (FOO)
. Как вы сказали. Это, однако, относится только к функциональным макросам.
Это указано в ISO 9899: 2011 §6.10.3 ¶10, в котором говорится:
10 Директива предварительной обработки формы
# определить идентификатор lparen identifier-list opt) new-line для замены-списка
# определить идентификатор lparen ...) new-line замены-списка
# определить идентификатор lparen identifier-list ,...) new-line-список заметокопределяет функционально-подобный макрос с параметрами, использование которых аналогично синтаксическому вызову функции. Параметры указаны по необязательному списку идентификаторов, объем которых простирается от их в списке идентификаторов до символа новой строки, который завершает директиву #define препроцессора. Каждый последующий экземпляр функционально-подобного имени макроса, за которым следует ( как следующий токен предварительной обработки вводит последовательность токенов предварительной обработки который заменяется списком замещения в определении ( вызов макроса). Заменяемая последовательность предварительной обработки токены заканчиваются с помощью соответствующего ) токена предварительной обработки, пропускающего интерполяция согласованных пар левой и правой скобок жетоны. В пределах последовательности токенов предварительной обработки, составляющих вызывание функционально-подобного макроса, новая строка считается нормальной белый пробел.