![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Using the predefsBoost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 26. Boost.Predef 1.4.1
|
![]() |
Note |
---|---|
Обнаруженные определения предназначены для конфигурации, на которую нацелен компилятор. В частности, в кросс-компиляции это означает систему-мишень, а не систему-хозяин. |
Один использует индивидуальные определения для сравнения с конкретными версиями, сравнивая макрос<BOOST_VERSION_NUMBER
>. Например, чтобы сделать выбор на основе версии компилятора GCC C++, нужно:
#include <boost/predef.h> #include <iostream> int main() { if (BOOST_COMP_GNUC >= BOOST_VERSION_NUMBER(4,0,0)) std::cout << "GCC compiler is at least version 4.0.0" << std::endl; else std::cout << "GCC compiler is at older than version 4.0.0, or not a GCC compiler" << std::endl; return 0; }
Как вы можете заметить выше, пункт 23 также охватывает случай, когда конкретный компилятор не обнаружен. Но можно сделать тест также тест для обнаружения. Все определения предположений определяются как выражение 0 (нулевое), если оно не обнаружено. Следовательно, можно использовать обнаружение с естественным единственным условием. Например:
#include <boost/predef.h> #include <iostream> int main() { if (BOOST_COMP_GNUC) std::cout << "This is GNU GCC!" << std::endl; else std::cout << "Not GNU GCC." << std::endl; return 0; }
А поскольку предеф - это препроцессорные определения, то из препроцессора возможно то же самое:
#include <boost/predef.h> #include <iostream> #if BOOST_COMP_GNUC #if BOOST_COMP_GNUC >= BOOST_VERSION_NUMBER(4,0,0) const char * the_compiler = "GNU GCC, of at least version 4." #else const char * the_compiler = "GNU GCC, less than version 4." #endif #else const char * the_compiler = "Not GNU GCC." #endif int main() { std::cout << the_compiler << std::endl; return 0; }
Кроме того, для каждой версии макро определено<*_AVAILABLE
>макро определено только при обнаружении конкретного аспекта. То есть определение, эквивалентное:
#if BOOST_PREDEF_ABC #define BOOST_PREDEF_ABC_AVAILABLE #endif
Также для каждого аспекта существует макроопределение с описательным названием того, что такое обнаружение.
*_EMULATED
macros
Определения Predef гарантированно будут однозначно определены в рамках одной категории. Но есть контексты, в которых возможны множественные основные обнаружения. Хорошо известным примером этого является обнаружение компиляторов GCC и MSVC, которые обычно эмулируются другими компиляторами путем определения тех же базовых макросов. Для учета этого детектирования заголовкам разрешается определять<*_EMULATED
>предефы при обнаружении данной ситуации. Эмулированные предефы будут установлены на номер версии обнаружения вместо обычного макроса предеф для этого обнаружения. Например, MSVC установит<BOOST_COMP_MSVC_EMULATED
>, но не установит<BOOST_COM_MSVC
>, и он также установит<BOOST_COMP_MSVC_AVAILABLE
>.
BOOST_VERSION_NUMBER
macro
Все предефы определяются как использование макроса<BOOST_VERSION_NUMBER
>. Макро принимает отдельные основные, второстепенные и патч-выражения значений:
#define BOOST_VERSION_NUMBER( major, minor, patch ) ...
Аргументы таковы:
Диапазоны для каждого из них «вынуждены» использованием модуля («%»), то есть усечения, в отличие от зажима. И, следовательно, это означает, что ограничения соблюдаются только для того, чтобы избежать проблем вне зоны действия. Но этого недостаточно для предотвращения других проблем. Например, превышение диапазона и получение ложных обнаружений или необнаружений. Это зависит от индивидуальных предефов, чтобы обеспечить правильное использование за пределами гарантии диапазона.
Значения для аргументов могут быть любыми действительными для препроцессора постоянными выражениями значений. Только арифметика постоянных значений используется в определении макроса<BOOST_VERSION_NUMBER
>и в любом другом макросе. Это означает, что любое допустимое основание возможно, т.е. двоичное, октальное, десятичное и шестидесятичное. Например:
#define MY_APPLICATION_VERSION_NUMBER BOOST_VERSION_NUMBER(2,0xA,015)
Это эквивалентно:
#define MY_APPLICATION_VERSION_NUMBER BOOST_VERSION_NUMBER(2,10,13)
Статья Using the predefs раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 26. Boost.Predef 1.4.1 может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 26. Boost.Predef 1.4.1 ::
реклама |