Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

The Context Policy

Boost , ,

  The Context Policy

Введение
Заголовок «wave/preprocessing_hooks.hpp»
Функции члена

Introduction

Обратите внимание, что следующее описание относится к новому интерфейсу предварительной обработки крючков, используемому по умолчанию, начиная с выпуска Boost V1.35.0. Если вам интересен старый интерфейс, пожалуйста, посмотритездесь.

Политика контекста используется для обеспечения крючков обратного вызова, которые вызываются из библиотеки в пользовательский код, когда

  • признана директива препроцессора,
  • токен должен быть возвращен из препроцессора,
  • a макроустановка определена или не определена,
  • макрос был расширен или отсканирован;
  • файл был открыт или закрыт,
  • оценивалось условное выражение,
  • токен должен быть пропущен, поскольку он содержится в неоцененном условном блоке;
  • a прагма формы'волновой вариант [(значение)]'была признана.

Этот тип политики используется в качестве шаблонного параметра для повышения::wave:::context<>объекта, где политика по умолчанию обеспечивает только функции пустых крючков.

Header wave/preprocessing_hooks.hpp synopsis

namespace boost {
namespace wave {
namespace context_policies {

struct default_preprocessing_hooks {

// general hook functions template <typename ContextT, typename TokenT>
bool found_directive(ContextT const &ctx,
TokenT const &directive);
template <typename ContextT, typename ExceptionT>
void throw_exception(ContextT const &ctx,
ExceptionT const& e);

// test, whether a given token may be skipped
template <typename ContextT>
bool may_skip_whitespace (ContextT const& ctx,
TokenT &token, bool &skipped_newline);
// Conditional compilation template <
typename ContextT, typename TokenT,
typename ContainerT
>
bool evaluated_conditional_expression(
ContextT const &ctx, TokenT const& directive,
ContainerT const& expression, bool expression_value);
template <typename ContextT, typename TokenT>
void skipped_token(ContextT const &ctx,
TokenT const& token);

template <typename ContextT, typename TokenT>
TokenT const& generated_token(ContextT const &ctx,
TokenT const& token);

// macro expansion tracing template < typename ContextT, typename TokenT, typename ContainerT,
typename IteratorT
>
bool expanding_function_like_macro(
ContextT const &ctx, TokenT const &macrodef,
std::vector<TokenT> const &formal_args,
ContainerT const &definition, TokenT const &macrocall,
std::vector<ContainerT> const &arguments,
IteratorT const &seqstart, Iterator const &seqend);

template <typename ContextT, typename TokenT, typename ContainerT>
bool expanding_object_like_macro(
ContextT const &ctx, TokenT const &macro,
ContainerT const &definition, TokenT const &macrocall);

template <typename ContextT, typename ContainerT>
void expanded_macro(ContextT const &ctx,
ContainerT const &result);

template <typename ContextT, typename ContainerT>
void rescanned_macro(ContextT const &ctx,
ContainerT const &result);

// include file tracing functions template <typename ContextT>
bool found_include_directive(ContextT const &ctx,
std::string const &filename, bool include_next);
template <typename ContextT>
void opened_include_file(ContextT const &ctx,
std::string const &relname, std::string const& absname,
bool is_system_include);
template <typename ContextT>
void returning_from_include_file(ContextT const &ctx);
template <typename ContextT>
void detected_include_guard(ContextT const &ctx, std::string const& filename, std::string const& include_guard);
template <typename ContextT, typename TokenT>
void detected_pragma_once(ContextT const &ctx, TokenT const& pragma_token, std::string const& filename);

// interpretation of #pragma's of the form // 'wave option[(value)]' template <typename ContextT, typename ContainerT>
bool interpret_pragma(ContextT const &ctx, ContainerT &pending,
typename ContextT::token_type const &option,
ContainerT const &values,
typename ContextT::token_type const &pragma_token);

// macro definition hooks template <
typename ContextT, typename TokenT, typename ParametersT, typename DefinitionT
>
void defined_macro(ContextT const &ctx, TokenT const &name, bool is_functionlike, ParametersT const &parameters,
DefinitionT const &definition, bool is_predefined);

template <typename ContextT, typename TokenT>
void undefined_macro(ContextT const &ctx,
TokenT const &name);

// #error and #warning directive hooks template <typename ContextT, typename ContainerT>
bool found_warning_directive(ContextT const &ctx,
ContainerT const &message);

template <typename ContextT, typename ContainerT>
bool found_error_directive(ContextT const &ctx,
ContainerT const &message);

// #line directive hook template <typename ContextT, typename ContainerT>
void found_line_directive(ContextT const &ctx,
ContainerT const &arguments, unsigned int line,
std::string const& filename);
};

}}} // namespace boost::wave::context_policies

Member functions

General hook functions

found_directive

    template <typename ContextT, typename TokenT>
bool found_directive(ContextT const& ctx, TokenT const &directive);

Функцияfound_directiveназывается, когда препроцессор обнаружил одну из директив предварительной обработки#define,#undef,#if,#ifndef,#elif,#endif,#error,#include,#pragmaили#warning.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Директиваотносится к токену, содержащему обнаруженную директиву предварительной обработки.

Если значение возвратаистинно, директива будет пропущена полностью, т.е. предварительная обработка не производится. Общая директива заменяется одной новой строкой. Если значение возвраталожно, директива обрабатывается обычным способом.

бросок_исключение

    template <typename ContextT, typename ExceptionT>
void throw_exception(ContextT const &ctx,
ExceptionT const& e);

throw_ Исключениеназывается всякий раз, когда происходит исключение предварительной обработки.

Параметрctxсодержит ссылку наcontext_type, используемый при инстантировании итераторов предварительной обработки пользователем.

Параметр  eявляется объектом исключения, содержащим подробную информацию об ошибке.

may_skipwhitespace

    template <typename ContextT, typename TokenT>
bool may_skip_whitespace(ContextT const& ctx, TokenT &token,
bool& skipped_newline);

Функцияmay_skipwhitespaceбудет вызываться библиотекой всякий раз, когда токен собирается быть возвращен в вызывающее приложение.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Обратите внимание, что этот параметр был добавлен для выпуска Wave V1.2.4.

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

Параметрskipped_newlineсодержит ссылку на булево значение, которое должно быть установлено в соответствии с функцией политики всякий раз, когда новая линия будет пропущена.

Если значение возвратаистинно, данный токен пропускается, и предварительная обработка продолжается до следующего токена. Если значение возвраталожное, то данный токен возвращается в вызывающее приложение. Осторожность должна быть использована, потому что, возвращаяистинное, функция политики способна заставить пропустить даже значительные токены.

Conditional compilation hook functions

оценено_условное_выражение

   template <typename ContextT, typename TokenT, typename ContainerT>
    bool evaluated_conditional_expression(ContextT const& ctx, 
TokenT const& directive, ContainerT const& expression,
bool
expression_value);

Функцияevaluated_conditional_expressionназывается, когда препроцессор сталкивался с директивой#if,#elif,#ifdefили#ifndef. Этот крючок проходит нерасширенное условное выражение (как оно было дано в анализируемом исходном файле) и результат оценки этого выражения в текущем контексте предварительной обработки.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Параметртокенасодержит ссылку на оцениваемый токен директивы.  

Параметрвыражениясодержит нерасширенную последовательность токенов, содержащую оцениваемое выражение.

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

Возвратное значение определяет, нужно ли снова оценивать данное выражение, позволяя решить, какая из условных ветвей должна быть расширена. Вы должны вернутьистинноеиз этой функции крючка, чтобы заставить выражение быть переоцененным. Обратите внимание, что это было изменено спустотыдля выпуска Boost V1.35.0.

skipped_token

    template <typename ContextT, typename TokenT>
void skipped_token(ContextT const& ctx, TokenT const& token);

Функцияskipped_tokenназывается всякий раз, когда токен собирается быть пропущен из-за ложного предпроцессорного состояния (фрагменты кода должны быть пропущены внутри не оцененных условных#если/#else/#endifветвей).

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Параметртокенотносится к токену, который должен быть пропущен.

сгенерированный_токен

    template <typename ContextT, typename TokenT>
TokenT const& generated_token(ContextT const& ctx, TokenT const& token);

Функцияgenerated_tokenвызывается всякий раз, когда токен собирается быть возвращен из библиотеки.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Параметртокенотносится к токену, который должен быть возвращен из библиотеки. Эта функция может изменять токен, но в этом случае она должна быть реализована с неконст-ссылкой на параметр токена, позволяя изменять токен на месте.

По умолчанию поведение заключается в том, чтобы вернуть переданную ссылку на токен без изменений абоненту.

Macro expansion tracking functions

expand_function_like_macro

   template <typename ContextT, typename TokenT, typename ContainerT>
bool expanding_function_like_macro(
ContextT const& ctx, TokenT const &macrodef,
std::vector<TokenT> const &formal_args,
ContainerT const &definition, TokenT const &macrocall,
std::vector<ContainerT> const &arguments,
IteratorT const &seqstart, Iterator const &seqend);

Функцияexpand_function_like_macroназывается всякий раз, когда должно быть расширено функциональное макросо, то естьдофактического расширения.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Параметрмакроимяобозначает положение, в котором определяется макрос для расширения. Он содержит токен, который идентифицирует макро-имя, используемое внутри соответствующего макро-определения.

Параметрformal_argsсодержит формальные аргументы, используемые при определении макроса.

Параметрсодержит макроопределение для макроотслеживания. Это стандартный контейнер STL, который содержит последовательность токенов, идентифицированную во время макроопределения как список замены макросов.

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

Параметраргументовсодержит макроаргументы, используемые при вызове макроса. Это вектор стандартных STL-контейнеров, которые содержат последовательности токенов, идентифицированные в положении макровызова в качестве аргументов, которые будут использоваться во время макрорасширения.

Параметрыseqstartиseqendуказывают на входной поток токенов, позволяющий получить доступ ко всей последовательности токенов, содержащей макровызов (начиная с открывающего скобка и заканчивая после закрывающего).

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

расширение_объект_подобный_макро

    template <typename ContextT, typename TokenT, typename ContainerT>
bool expanding_object_like_macro(
ContextT const& ctx, TokenT const &macro,
ContainerT const &definition, TokenT const &macrocall);

Функцияexpand_object_like_macroназывается всякий раз, когда объектоподобный макрос должен быть расширен, то естьдофактического расширения начинается.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Параметрмакроимяобозначает положение, в котором определяется макрос для расширения. Он содержит токен, который идентифицирует макро-имя, используемое внутри соответствующего макро-определения.

Параметрсодержит макроопределение для макроотслеживания. Это стандартный контейнер STL, который содержит последовательность токенов, идентифицированную во время макроопределения как список замены макросов.

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

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

расширен_макро

    template <typename ContextT, typename ContainerT>
void expanded_macro(ContextT const& ctx, ContainerT const &result);

Функцияexpand_macroназывается всякий раз, когда завершено расширение макроса, список замены полностью сканируется, и идентифицированные макросы в настоящем документе заменяются соответствующими результатами расширения, нодоначинается процесс сканирования.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Параметррезультатасодержит результат макрорасширения до сих пор. Это стандартный контейнер STL, содержащий генерируемую последовательность токенов.

rescanned_macro

    template <typename ContextT, typename ContainerT>
void rescanned_macro(ContextT const& ctx, ContainerT const &result);

Функцияrescanned_macroназывается всякий раз, когда сканирование макроса завершено, т.е. макрорасширение завершено.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Параметррезультатасодержит результат всего макрорасширения. Это стандартный контейнер STL, содержащий генерируемую последовательность токенов.

Include file tracing functions

found_include_directive

    template <typename ContextT>
bool found_include_directive(ContextT const& ctx,
std::string const &filename, bool include_next);

Функция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

    template <typename ContextT>
void opened_include_file(ContextT const& ctx,
std::string const &rel_filename, std::string const &abs_filename,
bool is_system_include);

Функцияopen_include_fileназывается всякий раз, когда файл, упомянутый директивой#include, был успешно обнаружен и открыт.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Параметрrel_filenameсодержит (нормализованный) вероятно относительный путь файловой системы открытого файла. Конкретный формат этого имени файла зависит от формата включения пути поиска, данного библиотеке заранее.

Параметрabs_filenameсодержит (нормализованный) полный путь файловой системы открытого файла.

Параметрis_system_includeобозначает, если данный файл был найден в результате директивы#include <...>.

Return_from_include_file

    template <typename ContextT>
void returning_from_include_file(ContextT const& ctx);

Функцияreturn_from_include_fileвызывается всякий раз, когда включенный файл собирается закрыться после завершения его обработки.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

detected_include_guard

    template <typename ContextT>
void detected_include_guard(ContextT const& ctx, std::string const& filename, std::string const& include_guard);

Функцияdetected_include_guardназывается всякий раз, когда файлninclude собирается быть добавлен в список #pragma один раз заголовки в результате обнаруженной схемы include guard. Это означает, что этот файл заголовка не будет открыт и разобран снова, даже если он указан в более поздней директиве#include.  

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

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

Параметрinclude_guardсодержит имя обнаруженного include guard.

detected_pragma_once

    template <typename ContextT, typename TokenT>
void detected_pragma_once(ContextT const& ctx, TokenT const& pragma_token, std::string const& filename);

Функцияdetected_pragma_onceвызывается всякий раз, когда файлninclude собирается быть добавлен в список заголовков #pragma один раз в результате обнаруженной#pragma один раздирективы. Это означает, что этот файл заголовка не будет открыт и разобран снова, даже если он указан в более поздней директиве#include.

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

Параметр pragma_token относится к токену "#pragma", запускающему этот крюк предварительной обработки.

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

Interpretation of #pragma's

интерпретация_прагма

    template <typename ContextT, typename ContextT, typename ContainerT>
bool interpret_pragma(ContextT const &ctx, ContainerT &pending,
typename ContextT::token_type const &option,
ContainerT const &values,
typename ContextT::token_type const &pragma_token);

Функцияinterpret_pragmaназывается всякий раз, когда непризнанная#pragma wave ...или оператор_Pragma("wave ...")находится во входном потоке.

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

Параметрв ожиданииможет быть использован для выталкивания токенов обратно во входной поток, который должен использоваться в качестве заменяющего текста для всей директивы#pragma wave(). Если эта последовательность остается пустой, замена не происходит, т.е. интерпретируемая директива удаляется из генерируемого потока токенов.

Параметрсодержит название интерпретируемой прагмы.

Параметрсодержит значение параметра, предоставленного оператору прагмы.

Параметрpragma_tokenсодержит фактический токен #pragma, который может использоваться для извлечения информации о местоположении для некоторого вывода ошибки.

Если значение возврата является «ложным», вся директива #pragma интерпретируется как неизвестная и выдается соответствующее сообщение об ошибке. Обратное значение «истинного» означает успешную интерпретацию данной прагмы.

Macro definition

определен_макро

    template <
typename ContextT, typename TokenT, typename ParametersT, typename DefinitionT
>
void defined_macro(ContextT const& ctx,
TokenT const &name, bool is_functionlike,
ParametersT const &parameters, DefinitionT const &definition,
bool is_predefined);

Функцияdefined_macroназывается всякий раз, когда макрос был успешно определен.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Имяявляется ссылкой на токен, содержащий имя макроса.

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

Параметрпараметровсодержит токены параметров для макроопределения. Если макрос не имеет параметров или является объектом, подобным макросу, то этот контейнер пуст.

Определение параметрасодержит последовательность токенов, заданную как замещающая последовательность (часть определения) вновь заданного макроса.

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

undefined_macro

    template <typename ContextT, typename TokenT>
void undefined_macro(ContextT const& ctx, TokenT const &name);

Функцияundefined_macroназывается всякий раз, когда макроопределение было успешно удалено.

Параметрctxсодержит ссылку наcontext_type, используемый во время инстанцирования итераторов предварительной обработки пользователем. Отметим, этот параметр был добавлен для выпуска Boost V1.35.0.

Имясодержит маркер макроса, определение которого было удалено.

found_warning_drective

    template <typename ContextT, typename ContainerT>
bool found_warning_directive(ContextT const& ctx,
ContainerT const &message);

Функцияfound_warning_directiveназывается всякий раз, когда встречается директива#warning. Отметим, что эта функция была добавлена для выпуска Boost V1.35.0. Эта функция будет называться только в том случае, еслиBOOST_WAVE_SUPPORT_WARNING_DIRECTIVEпостоянная времени компиляции была определена до чего-то не равного нулю (см.Конфигурация времени компиляциидля получения дополнительной информации).

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

Сообщение о параметрессылается на последовательность токенов аргумента встречающейся директивы#предупреждения.

Если значение возвраталожно, библиотека выбрасывает препроцессорное исключение типа<warning_directive>(нормальное исполнение продолжается), если значение возвратаистинно, исполнение продолжается так, как если бы не было найдено директивы#предупреждениеи общая директива заменена одной новой строкой.

found_error_drective

    template <typename ContextT, typename ContainerT>
bool found_error_directive(ContextT const& ctx,
ContainerT const &message);

Функцияfound_error_directiveназывается всякий раз, когда встречается директива#error. Отметим, что эта функция была добавлена для выпуска Boost V1.35.0.

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

Сообщение с параметромссылается на последовательность маркеров аргумента встречающейся директивы#error.

Если значение возврата являетсяложным, библиотека выбрасывает препроцессорное исключение типа<error_directive>(нормальное исполнение продолжается), если значение возврата являетсяистинным, исполнение продолжается так, как будто не найдена директива#errorи общая директива заменена одной новой строкой.

found_line_drective

    template <typename ContextT, typename ContainerT>
void found_line_drective(ContextT const& ctx,
ContainerT const &arguments, unsigned int line,
std::string const& filename);

Функцияfound_line_directiveназывается всякий раз, когда встречается директива#line. Отметим, что эта функция была добавлена для выпуска Boost V1.35.0.

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

Параметраргументовссылается на последовательность токенов аргумента встречающейсядирективы #линии.

Параметрстрокасодержит распознанный номер строки из директивы#линии.

Параметримени файлассылается на распознанное имя файла из директивы#line(если оно было дано).


Статья The Context Policy раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:23:45/0.033869981765747/1