Обрабатываются ли директивы препроцессора перед развертыванием макросов?
Обрабатываются ли директивы препроцессора перед развертыванием макросов ?
Спасибо
1 ответ:
Да и нет. Каждая директива препроцессора определяет свое собственное взаимодействие с заменой макросов. Общее правило (C++11 16/6):
Токены предварительной обработки в директиве предварительной обработки не подлежат расширению макроса, если не указано иное изложенный.
Другим соответствующим общим правилом является 16/1:
A директива предварительной обработки состоит из последовательности токенов предварительной обработки, удовлетворяющих следующим ограничениям: Первый жетон в последовательности есть токен предварительной обработки
#
, который (в начале фазы трансляции 4) является либо первый символ в исходном файле (необязательно после пробела, не содержащего символов новой строки) или что следует за пробелом, содержащим по крайней мере один символ новой строки. Последний маркер в последовательности - это первая новая строка символ, следующий за первым маркером в последовательности. Символ новой строки завершает предварительную обработку директива, даже если она возникает в рамках того, что в противном случае было бы вызов макроса, подобного функции.(фаза перевода 4-это предварительная обработка).
Некоторые правила для отдельных директив:
#if
и#elif
развернуть макросы в их аргументах, за исключением аргументовdefined
(16.1/4).
#include
расширяет макросы в своих аргументах; в конечном счете они должны расширяться до строки, разделенной""
или<>
.
#line
расширяет макросы в своих аргументах; в конечном счете они должны расширяться до допустимого синтаксиса для аргументов не-макроса к#line
(16.4/5)