Обратите внимание, что следующее описание относится к новому интерфейсу предварительной обработки крючков, используемому по умолчанию, начиная с выпуска Boost V1.35.0. Если вам интересен старый интерфейс, пожалуйста, посмотритездесь.
Политика контекста используется для обеспечения крючков обратного вызова, которые вызываются из библиотеки в пользовательский код, когда
признана директива препроцессора,
токен должен быть возвращен из препроцессора,
a макроустановка определена или не определена,
макрос был расширен или отсканирован;
файл был открыт или закрыт,
оценивалось условное выражение,
токен должен быть пропущен, поскольку он содержится в неоцененном условном блоке;
a прагма формы'волновой вариант [(значение)]'была признана.
Этот тип политики используется в качестве шаблонного параметра для повышения::wave:::context<>объекта, где политика по умолчанию обеспечивает только функции пустых крючков.
Функцияfound_directiveназывается, когда препроцессор обнаружил одну из директив предварительной обработки#define,#undef,#if,#ifndef,#elif,#endif,#error,#include,#pragmaили#warning.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Директиваотносится к токену, содержащему обнаруженную директиву предварительной обработки.
Если значение возвратаистинно, директива будет пропущена полностью, т.е. предварительная обработка не производится. Общая директива заменяется одной новой строкой. Если значение возвраталожно, директива обрабатывается обычным способом.
Функцияmay_skipwhitespaceбудет вызываться библиотекой всякий раз, когда токен собирается быть возвращен в вызывающее приложение.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Обратите внимание, что этот параметр был добавлен для выпуска Wave V1.2.4.
Параметртокенасодержит ссылку на текущий токен. Политика может свободно изменять этот токен, если это необходимо.
Параметрskipped_newlineсодержит ссылку на булево значение, которое должно быть установлено в соответствии с функцией политики всякий раз, когда новая линия будет пропущена.
Если значение возвратаистинно, данный токен пропускается, и предварительная обработка продолжается до следующего токена. Если значение возвраталожное, то данный токен возвращается в вызывающее приложение. Осторожность должна быть использована, потому что, возвращаяистинное, функция политики способна заставить пропустить даже значительные токены.
Функцияevaluated_conditional_expressionназывается, когда препроцессор сталкивался с директивой#if,#elif,#ifdefили#ifndef. Этот крючок проходит нерасширенное условное выражение (как оно было дано в анализируемом исходном файле) и результат оценки этого выражения в текущем контексте предварительной обработки.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Параметртокенасодержит ссылку на оцениваемый токен директивы.
Параметрexpression_valueсодержит результат оценки выражения в текущем контексте предварительной обработки.
Возвратное значение определяет, нужно ли снова оценивать данное выражение, позволяя решить, какая из условных ветвей должна быть расширена. Вы должны вернутьистинноеиз этой функции крючка, чтобы заставить выражение быть переоцененным. Обратите внимание, что это было изменено спустотыдля выпуска Boost V1.35.0.
Функцияskipped_tokenназывается всякий раз, когда токен собирается быть пропущен из-за ложного предпроцессорного состояния (фрагменты кода должны быть пропущены внутри не оцененных условных#если/#else/#endifветвей).
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Параметртокенотносится к токену, который должен быть пропущен.
Функцияgenerated_tokenвызывается всякий раз, когда токен собирается быть возвращен из библиотеки.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Параметртокенотносится к токену, который должен быть возвращен из библиотеки. Эта функция может изменять токен, но в этом случае она должна быть реализована с неконст-ссылкой на параметр токена, позволяя изменять токен на месте.
По умолчанию поведение заключается в том, чтобы вернуть переданную ссылку на токен без изменений абоненту.
Функцияexpand_function_like_macroназывается всякий раз, когда должно быть расширено функциональное макросо, то естьдофактического расширения.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Параметрмакроимяобозначает положение, в котором определяется макрос для расширения. Он содержит токен, который идентифицирует макро-имя, используемое внутри соответствующего макро-определения.
Параметрformal_argsсодержит формальные аргументы, используемые при определении макроса.
Параметрсодержит макроопределение для макроотслеживания. Это стандартный контейнер STL, который содержит последовательность токенов, идентифицированную во время макроопределения как список замены макросов.
Параметрмакроколлобозначает положение, в котором этот макрос вызывается. Он содержит токен, который идентифицирует макровызов внутри предварительно обработанного входного потока.
Параметраргументовсодержит макроаргументы, используемые при вызове макроса. Это вектор стандартных STL-контейнеров, которые содержат последовательности токенов, идентифицированные в положении макровызова в качестве аргументов, которые будут использоваться во время макрорасширения.
Параметрыseqstartиseqendуказывают на входной поток токенов, позволяющий получить доступ ко всей последовательности токенов, содержащей макровызов (начиная с открывающего скобка и заканчивая после закрывающего).
Если значение возвратаистинно, макрос не расширяется, т.е. общая последовательность вызова макроса, включая параметры, копируется на выход без дальнейшей обработки. Если значение возвраталожно, макрос расширяется, как и ожидалось.
Функцияexpand_object_like_macroназывается всякий раз, когда объектоподобный макрос должен быть расширен, то естьдофактического расширения начинается.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Параметрмакроимяобозначает положение, в котором определяется макрос для расширения. Он содержит токен, который идентифицирует макро-имя, используемое внутри соответствующего макро-определения.
Параметрсодержит макроопределение для макроотслеживания. Это стандартный контейнер STL, который содержит последовательность токенов, идентифицированную во время макроопределения как список замены макросов.
Параметрмакроколлобозначает положение, в котором этот макрос вызывается. Он содержит токен, который идентифицирует макровызов внутри предварительно обработанного входного потока.
Если значение возвратаистинно, то макрос не расширяется, т.е. макросимвол копируется на выход без дальнейшей обработки. Если значение возвраталожно, макрос расширяется, как и ожидалось.
Функцияexpand_macroназывается всякий раз, когда завершено расширение макроса, список замены полностью сканируется, и идентифицированные макросы в настоящем документе заменяются соответствующими результатами расширения, нодоначинается процесс сканирования.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Параметррезультатасодержит результат макрорасширения до сих пор. Это стандартный контейнер STL, содержащий генерируемую последовательность токенов.
Функцияrescanned_macroназывается всякий раз, когда сканирование макроса завершено, т.е. макрорасширение завершено.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Параметррезультатасодержит результат всего макрорасширения. Это стандартный контейнер STL, содержащий генерируемую последовательность токенов.
Функцияfound_include_directiveназывается всякий раз, когда находится директива #include.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Параметримени файласодержит (расширенное) имя файла, найденное после директивы#include. Это формат,«файл»илифайл. Форматыили«файл»используются для директив#include, найденных в предварительно обработанном потоке токенов, форматфайлаиспользуется для файлов, указанных через аргумент командной строки --force_include.
Параметрinclude_nextявляется истинным, если найденная директива была директивой#include_nextиBOOST_WAVE_SUPPORT_INCLUDE_NEXTПостоянная предварительной обработки была определена для чего-то! 0.
Если значение возвратаистинно, директива включения не выполняется, то есть файл для включения не загружается и не обрабатывается. Общая директива заменяется одной новой строкой. Если значение возвраталожно, директива выполняется обычным способом.
Функцияopen_include_fileназывается всякий раз, когда файл, упомянутый директивой#include, был успешно обнаружен и открыт.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Параметрrel_filenameсодержит (нормализованный) вероятно относительный путь файловой системы открытого файла. Конкретный формат этого имени файла зависит от формата включения пути поиска, данного библиотеке заранее.
Параметрabs_filenameсодержит (нормализованный) полный путь файловой системы открытого файла.
Параметрis_system_includeобозначает, если данный файл был найден в результате директивы#include <...>.
Функцияreturn_from_include_fileвызывается всякий раз, когда включенный файл собирается закрыться после завершения его обработки.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Функцияdetected_include_guardназывается всякий раз, когда файлninclude собирается быть добавлен в список #pragma один раз заголовки в результате обнаруженной схемы include guard. Это означает, что этот файл заголовка не будет открыт и разобран снова, даже если он указан в более поздней директиве#include.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем.
Параметримени файласодержит путь файловой системы открытого файла (это относительно каталога в настоящее время обработанного файла или абсолютный путь в зависимости от путей, указанных как включающие в себя пути поиска).
Параметрinclude_guardсодержит имя обнаруженного include guard.
Функцияdetected_pragma_onceвызывается всякий раз, когда файлninclude собирается быть добавлен в список заголовков #pragma один раз в результате обнаруженной#pragma один раздирективы. Это означает, что этот файл заголовка не будет открыт и разобран снова, даже если он указан в более поздней директиве#include.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем.
Параметр pragma_token относится к токену "#pragma", запускающему этот крюк предварительной обработки.
Параметримени файласодержит путь файловой системы открытого файла (это относительно каталога в настоящее время обработанного файла или абсолютный путь в зависимости от путей, указанных как включающие в себя пути поиска).
Функцияinterpret_pragmaназывается всякий раз, когда непризнанная#pragma wave ...или оператор_Pragma("wave ...")находится во входном потоке.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем.
Параметрв ожиданииможет быть использован для выталкивания токенов обратно во входной поток, который должен использоваться в качестве заменяющего текста для всей директивы#pragma wave(). Если эта последовательность остается пустой, замена не происходит, т.е. интерпретируемая директива удаляется из генерируемого потока токенов.
Параметрсодержит название интерпретируемой прагмы.
Параметрсодержит значение параметра, предоставленного оператору прагмы.
Параметрpragma_tokenсодержит фактический токен #pragma, который может использоваться для извлечения информации о местоположении для некоторого вывода ошибки.
Если значение возврата является «ложным», вся директива #pragma интерпретируется как неизвестная и выдается соответствующее сообщение об ошибке. Обратное значение «истинного» означает успешную интерпретацию данной прагмы.
Функцияdefined_macroназывается всякий раз, когда макрос был успешно определен.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Имяявляется ссылкой на токен, содержащий имя макроса.
Параметрявляется_функциональнымустанавливается как истинный всякий раз, когда вновь определенный макрос определяется как функция, подобная макросу.
Параметрпараметровсодержит токены параметров для макроопределения. Если макрос не имеет параметров или является объектом, подобным макросу, то этот контейнер пуст.
Определение параметрасодержит последовательность токенов, заданную как замещающая последовательность (часть определения) вновь заданного макроса.
Параметрis_predefinedустановлен для всех макросов, предопределенных во время начальной фазы библиотеки.
Функцияundefined_macroназывается всякий раз, когда макроопределение было успешно удалено.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.
Имясодержит маркер макроса, определение которого было удалено.
Функцияfound_warning_directiveназывается всякий раз, когда встречается директива#warning. Отметим, что эта функция была добавлена для выпуска Boost V1.35.0. Эта функция будет называться только в том случае, еслиBOOST_WAVE_SUPPORT_WARNING_DIRECTIVEпостоянная времени компиляции была определена до чего-то не равного нулю (см.Конфигурация времени компиляциидля получения дополнительной информации).
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем.
Сообщение о параметрессылается на последовательность токенов аргумента встречающейся директивы#предупреждения.
Если значение возвраталожно, библиотека выбрасывает препроцессорное исключение типа<warning_directive>(нормальное исполнение продолжается), если значение возвратаистинно, исполнение продолжается так, как если бы не было найдено директивы#предупреждениеи общая директива заменена одной новой строкой.
Функцияfound_error_directiveназывается всякий раз, когда встречается директива#error. Отметим, что эта функция была добавлена для выпуска Boost V1.35.0.
Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем.
Сообщение с параметромссылается на последовательность маркеров аргумента встречающейся директивы#error.
Если значение возврата являетсяложным, библиотека выбрасывает препроцессорное исключение типа<error_directive>(нормальное исполнение продолжается), если значение возврата являетсяистинным, исполнение продолжается так, как будто не найдена директива#errorи общая директива заменена одной новой строкой.
Distributed under the Boost Software License, Version
1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
Last updated:
Thursday, September 18, 2010
09:10
Статья The Context Policy раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.