![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
The Macro Expansion ProcessBoost , ,
Описанный здесь процесс макрорасширения был первоначально разработан. Замена макро идет слева направо. Если во время сканирования (или сканирования) найден идентификатор, он просматривается в таблице символов. Если идентификатор не найден в таблице символов, это не макрос и сканирование продолжается. Если идентификатор найден, значение флага, связанного с идентификатором, используется для определения того, доступен ли идентификатор для расширения. Если это не так, то конкретный токен (то есть конкретный экземпляр идентификатора) помечается как отключенный и не расширяется. Если идентификатор доступен для расширения, значение другого флага, связанного с идентификатором в таблице символов, используется для определения, является ли идентификатор объектоподобным или функционально-подобным макросом. Если это объектоподобный макрос, он расширяется. Если это функциональный макрос, он расширяется только в том случае, если следующий токен является левым скобком. (Если макрос подобен объекту, пропустите следующие два абзаца.) Если макрос, подлежащий расширению, является функционально-подобным макросом, он должен иметь точное число фактических аргументов в качестве числа формальных параметров, требуемых определением макроса. Каждый аргумент рекурсивно сканируется и расширяется. Каждое имя параметра, найденное в списке замены, заменяется расширенным фактическим аргументом после того, как ведущее и отстающее белое пространство и все токены-заполнители удаляются, если имя параметра не следует сразу за оператором штриховки ('#') или не примыкает к оператору токена-пастинга ('##'). Если имя параметра сразу же следует за оператором струнирования'#', вставляется струнная версия нерасширенного фактического аргумента. Если имя параметра соседствует с оператором размещения токенов'##', нерасширенный фактический аргумент вставляется после удаления всех токенов-заполнителей. Вся связь происходит в списке замены. (Если одно соединение дает несколько токенов, поведение не определено.) Более того,Waveв обычных режимах C++98 и C99 выдает ошибку, если в результате конкатенации производится более одного токена. В режиме C++0xWaveтрактует токен-пастинг несвязанных токенов, а также четко определен и вставляет репарированное представление строки конкатенированных токенов в список замены. Флаг в таблице символов, связанный с именем расширяемого макроса, устанавливается для указания на то, что макрос не доступен для расширения. Список замен будет пересканирован для дальнейшего расширения. Все ведущие и отстающие токены белого пространства в списке замены удаляются (токены заполнителя остаются нетронутыми). После завершения сканирования флаг в таблице символов, связанный с расширением имени макроса, очищается, чтобы указать, что макрос снова доступен для расширения, и последовательность токенов, которая составляет список замены с повторным сканированием, возвращается в точку вызова макроса. Если эта последовательность токенов пуста, она заменяется токеном-заполнителем. Если во время сканирования (или сканирования) обнаруживается заполнитель, он игнорируется. (Кроме того, если единственное, что отделяет параметр от оператора штриховки или оператора токенов, является заполнителем, это также игнорируется в этом контексте.) Эта последовательность токенов вставляется в исходную точку, в которой был задействован макрос, и сканирование продолжается, начиная с последнего токена вновь вставленной последовательности токенов. То есть сканирование оглядывается на один токен (возможно, токен-заполнитель) и продолжается.
Copyright © 2003-2011 Hartmut Kaiser Last updated: Sunday, May 15, 2005 12:23
Статья The Macro Expansion Process раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |