2015-03-04 4 views

ответ

3

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

Предварительная обработка лексемы в пределах директивы препроцессора не подлежат макроподстановкам, если иное не указано .

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

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

(Фаза перевода 4 является предварительной обработкой).

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

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

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

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