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

Chapter 26. Boost.Predef 1.4.1

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Part I. The Boost C++ Libraries (BoostBook Subset)

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Chapter 26. Boost.Predef 1.4.1

Rene Rivera

Распространяется под лицензией 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, чтобы предоставить больше и последовательную информацию, чем определения функций, которые она поддерживает. Ниже приводится отредактированная версия этого краткого предложения.

Proposal

Идея состоит в том, чтобы определить набор макросов для идентификации компиляторов и последовательно представлять их версию. Это включает в себя:

  • Уникальный макрос 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, является лучшим решением.

Current Library

Нынешняя библиотека Predef в настоящее время является независимой библиотекой и расширена по охвату. Он включает в себя обнаружение и определение архитектур, компиляторов, языков, библиотек, операционных систем и эндианности. Основными преимуществами являются:

  • Номера версий, которые всегда определены так, что не нужно охранять<#ifdef>.
  • Защитные макросы, которые можно использовать для<#ifdef>проверок.
  • Все возможные определения включены в один<#include <boost/predef.h>>, чтобы он был дружественным к предварительно составленному использованию заголовка.
  • Конкретные определения могут быть включены, например<#include <boost/predef/os/windows.h>>для единичных проверок.
  • Предефы могут непосредственно использоваться как в выражениях препроцессора, так и в выражениях компилятора для сравнения с другими аналогичным образом определенными значениями.
  • Заголовки можно использовать на нескольких языках, которые поддерживают препроцессор C. В частности, C++, C, Objective C и Objective C++.

Design choices

Важный выбор дизайна касается того, как представлять версии компилятора с помощью одного целого числа, подходящего для использования в директивах предварительной обработки. Давайте немного подсчитаем. «Основной» подписанный тип для предварительной обработки постоянных выражений является длинным в C90 (и C++, по состоянию на 2006 год) и intmax_t в C99. Длина шрифта должна по меньшей мере представлять число<+2 147 483 647>. Это означает, что самая значительная цифра может быть только 0, 1 или 2; и если мы хотим, чтобы все десятичные цифры могли варьироваться от 0 до 9, самый большой диапазон, который мы можем рассмотреть, это<[0, 999 999 999]>. Распространение равномерно, это означает 3 десятичных цифры для каждой части номера версии.

Итак, мы можем:

  1. использовать неравномерное распределение или
  2. использовать больше битов (более крупный тип) или
  3. использовать 3/3/3 и иметь дело с конкретным компилятором/платформой/stdlib с установкой чисел в пределах 3-значного диапазона.

Кажется относительно безопасным пойти на первый вариант и установить его на 2/2/5. Это охватывает CodeWarrior и другие, которые до 10 и более для основного числа. Некоторые компиляторы используют номер сборки вместо первого патча; пять цифр (которые уже достигнуты VC++). 8) представляется разумным пределом даже в этом случае.

[Note] Note

Схема 2/2/6 позволила бы увеличить количество патчей/билдов за счет, например, ограничения основного номера версии до 20 (или, с дополнительными ограничениями, до 21).

Это может заверить читателя, что это решение фактически закодировано в одном месте в коде; определение<BOOST_VERSION_NUMBER>.

Future work

Несмотря на то, что основы этой библиотеки выполнены, есть много работы, которую можно сделать:

  • Прямо сейчас мы ограничиваем обнаружение библиотек известными встроенными предопределенными макросами и гарантируем существование системных и библиотечных заголовков. Может быть интересно добавить что-то вроде предефов автоконфигурации. Таким образом, мы можем добавить определения для пользовательских библиотек и функций.
  • Наряду с вышесказанным, может быть полезно добавить некоторое управление пользователем относительно того, какие заголовки включены в заголовк верхнего уровня. Хотя в нынешней форме библиотеки это менее проблематично, поскольку можно включить конкретные заголовки, которые вам нужны.
  • Кроме того, даже если нет опции автоматической настройки стиля. Было бы хорошо добавить дополнительно включенные заголовки, чтобы пользователь мог получить согласованные определения номеров версий для библиотек, которые они используют.
  • Наличие согласованного набора определений номеров версий открывает двери для улучшения синтаксиса пользовательского уровня библиотек, которые проверяют номера версий. В частности, макрос Boost Config<BOOST_WORKAROUND>получит более читаемый синтаксис. Как и<BOOST_TESTED_AT>детальный макрос.
  • И, очевидно, есть много работы по переформулированию существующих библиотек Boost, чтобы использовать библиотеку Predef, как только она будет принята.
  • Продолжается работа по добавлению определений для нынешних и будущих компиляторов, платформ, архитектур, языков и библиотек.

PrevUpHomeNext

Статья Chapter 26. Boost.Predef 1.4.1 раздела The Boost C++ Libraries BoostBook Documentation Subset Part I. The Boost C++ Libraries (BoostBook Subset) может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Part I. The Boost C++ Libraries (BoostBook Subset) ::


реклама


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

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