Обрабатываются ли директивы препроцессора перед развертыванием макросов?


Обрабатываются ли директивы препроцессора перед развертыванием макросов ?

Спасибо

1 4

1 ответ:

Да и нет. Каждая директива препроцессора определяет свое собственное взаимодействие с заменой макросов. Общее правило (C++11 16/6):

Токены предварительной обработки в директиве предварительной обработки не подлежат расширению макроса, если не указано иное изложенный.

Другим соответствующим общим правилом является 16/1:

A директива предварительной обработки состоит из последовательности токенов предварительной обработки, удовлетворяющих следующим ограничениям: Первый жетон в последовательности есть токен предварительной обработки #, который (в начале фазы трансляции 4) является либо первый символ в исходном файле (необязательно после пробела, не содержащего символов новой строки) или что следует за пробелом, содержащим по крайней мере один символ новой строки. Последний маркер в последовательности - это первая новая строка символ, следующий за первым маркером в последовательности. Символ новой строки завершает предварительную обработку директива, даже если она возникает в рамках того, что в противном случае было бы вызов макроса, подобного функции.

(фаза перевода 4-это предварительная обработка).

Некоторые правила для отдельных директив:

  • #if и #elif развернуть макросы в их аргументах, за исключением аргументов defined (16.1/4).

  • #include расширяет макросы в своих аргументах; в конечном счете они должны расширяться до строки, разделенной "" или <>.

  • #line расширяет макросы в своих аргументах; в конечном счете они должны расширяться до допустимого синтаксиса для аргументов не-макроса к #line (16.4/5)