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