Распространяется под лицензией Boost Software License, версия 1.0. (См. сопроводительный файл LICENSE_1_0.txt или копию по адресуhttp://www.boost.org/LICENSE_1_0.txt)
Эта библиотека определяет набор компилятора, архитектуры, операционной системы, библиотеки и других номеров версий из информации, которую она может собирать из C, C++, Objective C и Objective C++, предварительно определенных макросов или тех, которые определены в общедоступных заголовках. Идея этой библиотеки возникла из предложения расширить библиотеку Boost Config, чтобы предоставить больше и последовательную информацию, чем определения функций, которые она поддерживает. Ниже приводится отредактированная версия этого краткого предложения.
Идея состоит в том, чтобы определить набор макросов для идентификации компиляторов и последовательно представлять их версию. Это включает в себя:
Уникальный макрос BOOST_VERSION_NUMBER (major,minor,patch) для указания номеров версий (к сожалению, название BOOST_VERSION уже взято для обозначения номера версии самого boost).
Макрософт идентификации компилятора, подходящий для использования в директивах<#if>/<#elif>, для каждого из поддерживаемых компиляторов. Все макросы будут определены независимо от компилятора. Один макрос, соответствующий используемому компилятору, будет определен в терминах BOOST_VERSION_NUMBER для переноса точной версии компилятора. Все остальные макросы расширяются до выражения, оценивающего до ложного (например, токен 0), чтобы указать, что соответствующий компилятор отсутствует.
«Нулевые значения» могут быть установлены для всех макросов в boost/config/select_compiler.hpp; тогда для каждого компилятора соответствующий идентификационный макрос будет #undef и повторно #определен в соответствующем boost/compiler/(cc.hpp); однако в контексте Boost. Инфраструктура Config, использующая заголовок «prefix» (предварительно) или boost/config/suffix.hpp, является лучшим решением.
Нынешняя библиотека Predef в настоящее время является независимой библиотекой и расширена по охвату. Он включает в себя обнаружение и определение архитектур, компиляторов, языков, библиотек, операционных систем и эндианности. Основными преимуществами являются:
Номера версий, которые всегда определены так, что не нужно охранять<#ifdef>.
Защитные макросы, которые можно использовать для<#ifdef>проверок.
Все возможные определения включены в один<#include<boost/predef.h>>, чтобы он был дружественным к предварительно составленному использованию заголовка.
Конкретные определения могут быть включены, например<#include<boost/predef/os/windows.h>>для единичных проверок.
Предефы могут непосредственно использоваться как в выражениях препроцессора, так и в выражениях компилятора для сравнения с другими аналогичным образом определенными значениями.
Заголовки можно использовать на нескольких языках, которые поддерживают препроцессор C. В частности, C++, C, Objective C и Objective C++.
Важный выбор дизайна касается того, как представлять версии компилятора с помощью одного целого числа, подходящего для использования в директивах предварительной обработки. Давайте немного подсчитаем. «Основной» подписанный тип для предварительной обработки постоянных выражений является длинным в C90 (и C++, по состоянию на 2006 год) и intmax_t в C99. Длина шрифта должна по меньшей мере представлять число<+2 147 483 647>. Это означает, что самая значительная цифра может быть только 0, 1 или 2; и если мы хотим, чтобы все десятичные цифры могли варьироваться от 0 до 9, самый большой диапазон, который мы можем рассмотреть, это<[0, 999 999 999]>. Распространение равномерно, это означает 3 десятичных цифры для каждой части номера версии.
Итак, мы можем:
использовать неравномерное распределение или
использовать больше битов (более крупный тип) или
использовать 3/3/3 и иметь дело с конкретным компилятором/платформой/stdlib с установкой чисел в пределах 3-значного диапазона.
Кажется относительно безопасным пойти на первый вариант и установить его на 2/2/5. Это охватывает CodeWarrior и другие, которые до 10 и более для основного числа. Некоторые компиляторы используют номер сборки вместо первого патча; пять цифр (которые уже достигнуты VC++). 8) представляется разумным пределом даже в этом случае.
Note
Схема 2/2/6 позволила бы увеличить количество патчей/билдов за счет, например, ограничения основного номера версии до 20 (или, с дополнительными ограничениями, до 21).
Это может заверить читателя, что это решение фактически закодировано в одном месте в коде; определение<BOOST_VERSION_NUMBER>.
Несмотря на то, что основы этой библиотеки выполнены, есть много работы, которую можно сделать:
Прямо сейчас мы ограничиваем обнаружение библиотек известными встроенными предопределенными макросами и гарантируем существование системных и библиотечных заголовков. Может быть интересно добавить что-то вроде предефов автоконфигурации. Таким образом, мы можем добавить определения для пользовательских библиотек и функций.
Наряду с вышесказанным, может быть полезно добавить некоторое управление пользователем относительно того, какие заголовки включены в заголовк верхнего уровня. Хотя в нынешней форме библиотеки это менее проблематично, поскольку можно включить конкретные заголовки, которые вам нужны.
Кроме того, даже если нет опции автоматической настройки стиля. Было бы хорошо добавить дополнительно включенные заголовки, чтобы пользователь мог получить согласованные определения номеров версий для библиотек, которые они используют.
Наличие согласованного набора определений номеров версий открывает двери для улучшения синтаксиса пользовательского уровня библиотек, которые проверяют номера версий. В частности, макрос Boost Config<BOOST_WORKAROUND>получит более читаемый синтаксис. Как и<BOOST_TESTED_AT>детальный макрос.
И, очевидно, есть много работы по переформулированию существующих библиотек Boost, чтобы использовать библиотеку Predef, как только она будет принята.
Продолжается работа по добавлению определений для нынешних и будущих компиляторов, платформ, архитектур, языков и библиотек.
Статья Chapter 26. Boost.Predef 1.4.1 раздела The Boost C++ Libraries BoostBook Documentation Subset Part I. The Boost C++ Libraries (BoostBook Subset) может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.