Spec-Zone.ru › GCC 4 CPP

3.9 Директивы внутри аргументов макроса

Иногда удобно использовать директивы препроцессора внутри аргументов макроса. Стандарты C и C++ заявляют, что в таких случаях поведение неопределено.

Версии CPP до 3.2 отклоняли такие конструкции с сообщением об ошибке. Это было единственное синтаксическое различие между обычными функциями и функциями-макросами, поэтому казалось привлекательным устранить это ограничение, и люди часто удивлялись, что не могут использовать макросы таким образом. Более того, иногда люди использовали условную компиляцию в списке аргументов обычной функции библиотеки, например, ‘printf’, только для того, чтобы обнаружить, что после обновления библиотеки ‘printf’ изменилась на функцию-макрос, и их код перестал компилироваться. Поэтому с версии 3.2 мы изменили CPP, чтобы успешно обрабатывать произвольные директивы внутри аргументов макроса точно так же, как бы он обрабатывал директиву, если бы вызов функции-макроса отсутствовал.

Если внутри вызова макроса этот макрос переопределяется, то новое определение вступает в силу ко времени предварительной подстановки аргументов, но исходное определение все же используется для замены аргументов. Вот патологический пример:

#define f(x) x x
f (1
#undef f
#define f 2
f)

который расширяется до

1 2 1 2

с семантикой, описанной выше.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/cpp/Directives-Within-Macro-Arguments.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API