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

Compile Time Configuration

Boost , ,

Compile Time Configuration

Конфигурация времени библиотечного компилятора

The C++ preprocessor iterator library may be configured at compile time by specifying different preprocessor constants to include different additional features. The possible preprocessor constants are described in the following table.

Summary of possible preprocessor constants for
library configuration
BOOST_WAVE_SUPPORT_WARNING_DIRECTIVE

Поддержите#предупреждениеДиректива

BOOST_WAVE_SUPPORT_MS_EXTENSIONS

Поддержка нескольких расширений языка MS (т.е.__int8et.al.)

BOOST_WAVE_PREPROCESS_ERROR_MESSAGE_BODY

Включите предварительную обработку тел сообщений#errorи#warningдиректив.

BOOST_WAVE_EMIT_PRAGMA_DIRECTIVES

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

BOOST_WAVE_PREPROCESS_PRAGMA_BODY

Включите предварительную обработку тел всех директив#прагма.
Обратите внимание, что корпусоператора  _Pragma()всегда предварительно обрабатывается, как того требует стандарт C99..

BOOST_WAVE_ENABLE_COMMANDLINE_MACROS

Включите функциональность, необходимую для определения макросов с синтаксисом командной строки (-DMACRO(x)=определение)

BOOST_WAVE_STRINGTYPE

Токены, созданныеБиблиотека Waveсодержит данные токена и положение файла, где этот токен был найден во входном потоке.
Эта константа может использоваться для переопределения типа данных, который используется для хранения данных токена и соответствующего имени файла. Если это не определено, это по умолчанию для std::string. (Здесь определенный тип данных должен быть совместим с std::string)

BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS

Если определено, то библиотека препроцессоров поддерживает вариадики и маркеры. Для поддержки режима C99 эта постоянная также должна быть определена.

BOOST_WAVE_SUPPORT_CPP0X

Если определено, то библиотека препроцессоров поддерживает ключевые слова C++0x и специфические функции C++0x, такие как вариадики, маркеры места, расширенные символы и строковые буквы. Это означает, что существует определенная константа<BOOST_WAVE_SUPPORT_VARIADICS_PLACEMARKERS>.

BOOST_WAVE_MAX_INCLUDE_LEVEL_DEPTH

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

BOOST_WAVE_SUPPORT_PRAGMA_ONCE

Если же он был установлен, то директива<#pragma once>поддерживаетсяВолной. Это указывает на то, что файл, в котором находится прагма, будет включен (открыт) только один раз компилятором в сборке.

BOOST_WAVE_SUPPORT_PRAGMA_MESSAGE

Если же он был определен, то директива<#pragma message("")>поддерживаетсяВолной. Эта прагма просто генерирует замечание, содержащее текст сообщения. Тело сообщения #pragma предварительно обрабатывается, когда<BOOST_>WAVE_PREPROCESS_PRAGMA_BODYПостоянная также определена.

BOOST_WAVE_SUPPORT_INCLUDE_NEXT

Если же он был определен, то директива<#include_next>поддерживаетсяВолной. Это синтаксически эквивалентно директивам<#include>, но может использоваться для наследования файла заголовка (т.е. для включения файла, который называется текущим файлом, содержащим<#include_next>).

BOOST_WAVE_USE_STRICT_LEXER

Если это определено для чего-то !=0, то лексеры C/C++ распознают строгий набор базовых исходных символов C99/C++. Если он не определен или не определен до нуля, лексеры распознают символ'$'как часть идентификаторов.

BOOST_WAVE_PRAGMA_KEYWORD

Если это определено строкой буквально, оно будет использоваться в качестве ключевого слова прагмы, признанного библиотекой как конкретная волновая прагма. Эта постоянная по умолчанию"wave", т.е. библиотека распознает все#pragma волновой вариант [(аргумент)]направляет и отправляет обработку в функцию предварительной обработки крючка (см.:Предварительная обработка крючков). Аргументы части прагмы являются факультативными.

BOOST_WAVE_USE_DEPRECIATED_PREPROCESSING_HOOKS

Если определено нечто, не равное нулю'0'Волна будет скомпилирована для использования амортизированных крючков предварительной обработки. Интерфейс крючков предварительной обработки был изменен после выпуска Boost V1.34.x. Эта константа позволяет компилировать приложения, используя более старый интерфейс.

BOOST_WAVE_SUPPORT_LONGLONG_INTEGER_LITERALS

Стандарт C++ требует, чтобы препроцессор использовал один из следующих типов для целых букв:<long>или<unsigned long>в зависимости от факультативного суффикса'u','l','ul'или'lu'. Иногда требуется предварительно обработать целые буквы больше, чем это (то есть<long long>или<unsigned long long>). Определение постоянной pp позволяет распознавать длинные целые числа, даже если они не имеют суффикса'll'.

Эта константа препроцессора эффективна только в том случае, если ваша целевая платформа поддерживает длинные целые числа<BOOST_HAS_LONG_LONG>. Обратите внимание, что этот параметр не относится к опции поддержки волн<support_option_long_long>, которая позволяет распознавать только суффиксы'll'.

BOOST_WAVE_SUPPORT_THREADING

Эта константа препроцессора позволяет установить, будет ли библиотека Wave построена с включенной поддержкой потоков или нет. Это значение (если определено) должно быть установлено на ноль ('0'), если резьба должна быть отключена, и на числовое значение, не равное нулю, если резьба должна быть включена явно.

Если эта постоянная не определена, волновая библиотека будет построена с использованием резьбы, взятой из среды сборки Boost (см.<BOOST_HAS_THREADS>в досументации конфигурации Boost).

Using a different token type or lexer type in conjunction with Wave

It is possible to use the Wave library while using your own token and/or lexer types. This may be achieved by providing your lexer type as the second template parameter while instantiating the boost::wave::context<> object. The token type used by the library is derived from the token_type typedef to be provided by the lexer type. If you want to provide your own token type only, you may use the boost::wave::lex_iterator<> type contained with the library. This type needs to be parametrized with the token type to use.

The Wave library contains several samples illustrating these possibilities. The cpp_tokens sample shows the usage of a custom lexer and a custom token types. The lexer type used is functionally fully compatible to the re2c [3] based lexer used by default. It is implemented based on the SLex [5] lexer example written by Dan Nuffer. The token type used therein is functionally equivalent to the default token type except for an additional operator<< used for dumping the information carried by the token.

Separation and inclusion compilation models

The Wave C++ preprocessor iterator library is build almost completely as a header only library (except for the re2c based lexer). If you're trying to include all required files at once you will mention, that the resulting compilation times are very large (up to an hour - depending on your system configuration). This straightforward method we'll call the inclusion compilation model. If you do not pay attention to compilation times, that's the way to go, no special handling is needed.

If you're interested in decreasing compilation times, the following method is to be used. This we will call it the separation compilation model. The trick is to separate the different objects such, that they are compilable separately. The function, which instantiates the templated object in question is factored out such, that its definition is visible to only one translation unit. To simplify this further this creation function is packaged into a small generator template structure.

There are two levels of separation implemented: the separation of the compilation of the C++ lexer and the separation of the compilation of the different Spirit grammars used. To use these separations you will have to define two preprocessor constants while compiling the whole application and you will have to explicitely instantiate some helper templates. The following tables shows these constants in detail.

Summary of possible compilation constants required
to enable the separation compilation model
Separate

<Preprocessor constant>

C++ lexer

<BOOST_>WAVE_SEPARATE_LEXER_INSTANTIATION

Spirit grammars

<BOOST_>WAVE_SEPARATE_GRAMMAR_INSTANTIATION

The following table shows the explicit template instantiations required, if you want to use the separation compilation model. The TokenT placeholder type has to be replaced with your token type to use and the LexIteratorT placeholder type has to be replaced with your lex iterator type you've used while instantiation of the boost::wave::context<> object. You will achieve the best results, if you place these into separate compilation units each. The IteratorT placeholder should be replaced by the iterator type, which was used to instantiate the boost::wave::context<> object.

Summary of required explicit template instantiations
required when using the separation compilation model
Separate

<Templates to explicitly instantiate>

C++ lexer template cpplexer::re2clex::new_lexer_gen<IteratorT>;
Spirit grammars

<templatewave::grammars::expression_grammar_gen<TokenT>;
templatewave::grammars::intlit_grammar_gen<TokenT>;
templatewave::grammars::chlit_grammar_gen<TokenT>;
templatewave::grammars::cpp_grammar_gen<LexIteratorT>;
templatewave::grammars::predefined_macros_grammar_gen<LexIteratorT>;
templatewave::grammars::defined_grammar_gen<LexIteratorT>;
>

Чтобы посмотреть на это, вы можете посмотреть. Программа драйверов Waveвключена в качестве сопроводительного образца в библиотеку препроцессоров C++. Соответствующие файлы называются явно"instantiate_...something.cpp", где'...somthing'является подсказкой, грамматика которой явно инстанцируется внутри. Используя модель разделения, время компиляции, необходимое для построения. Пример волнснижается до 90%.


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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 00:14:35/0.026793956756592/1