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

Guidelines for Boost Authors

Boost , Boost.Config , Boost.Config

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

Заголовок используется для передачи информации о конфигурации другим файлам повышения, что позволяет им справляться с платформенными зависимостями, такими как порядок арифметических байтов, прагмы компилятора или недостатки компилятора. Без такой информации о конфигурации многие современные компиляторы не работали бы с библиотеками Boost.

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

Заголовки конфигурации являются спорными, потому что некоторые рассматривают их как потворство сломанным компиляторам и поощрение нестандартных подмножеств. Добавление настроек для дополнительных платформ и поддержание существующих настроек также может быть проблемой. Другими словами, заголовки конфигурации являются необходимым злом, а не желаемой функцией. Политика boost config.hpp предназначена для минимизации проблем и максимизации преимуществ заголовка конфигурации.

Обратите внимание:

  • Усиление реализаторов библиотек не требуется для<#include <boost/config.hpp>>и не требуется каким-либо образом для поддержки компиляторов, которые не соответствуют стандарту C++ (ISO/IEC 14882).
  • Если реализатор библиотеки желает поддерживать какой-либо несоответствующий компилятор или поддерживать какую-либо специфическую функцию платформы, «<#include <boost/config.hpp>>» является предпочтительным способом получения информации о конфигурации, недоступной из стандартных заголовков, таких как<<climits>>и т.д.
  • Если информация о конфигурации может быть выведена из стандартных заголовков, таких как<<climits>>, используйте эти стандартные заголовки, а не<<boost/config.hpp>>.
  • Файлы, использующие макросы, определенные в<<boost/config.hpp>>, должны иметь разумное, стандартное поведение по умолчанию, если макрос не определен. Это означает, что отправной точкой для переноса<<boost/config.hpp>>на новую платформу является простое определение ничего конкретного для этой платформы. В редких случаях, когда нет разумного поведения по умолчанию, сообщение об ошибке должно описать проблему.
  • Если разработчик библиотеки Boost хочет что-то добавить к<config.hpp>, отправьте запрос в список рассылки Boost. Нет никакой гарантии, что такой запрос будет выполнен; намерение состоит в том, чтобы ограничить сложность config.hpp.
  • Цель состоит в том, чтобы поддерживать только компиляторы, которые появляются на пути к становлению C++. Стандартный компилятор, и только последние выпуски этих компиляторов.
  • Цель состоит не в том, чтобы отключить основные функции, которые сейчас хорошо поддерживаются большинством компиляторов, такие как пространства имен, исключения, RTTI или шаблоны.

Заголовок<<boost/config/warning_disable.hpp>>может использоваться для отключения определенных предупреждений компилятора, которые трудно или невозможно удалить иным образом.

Обратите внимание:

  • Этот заголовокникогда не должен включаться другим заголовком Boost, он должен использоваться только исходным файлом библиотеки или тестовым случаем.
  • Заголовок должен быть включен, прежде чем включать любой другой заголовок.
  • Этот заголовок отключает только предупреждения, с которыми трудно или невозможно справиться иным образом, и которые обычно испускаются только одним компилятором или в одном компиляторе собственные заголовки стандартной библиотеки.

В настоящее время он отключает следующие предупреждения:

компилятор

Предупреждение

Визуальный C++ 8 и более поздний

C4996: Ошибка «функция»: была признана устаревшей

Intel C++

Предупреждение 1786: относится к использованию «устаревших» стандартных библиотечных функций, а не C4996 в Visual C++.

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

Когда вы называете макрос, следуйте<BOOST_NO_>.Кое-чтоусловное обозначение, так что очевидно, что это макроотчет о дефекте.

Наконец, добавьте программу тестирования в регрессионные тесты. Вам нужно будет поместить тест-кейс в файл<.ipp>со следующими комментариями в верхней части:

//  MACRO:         BOOST_NO_FOO
//  TITLE:         foo
//  DESCRIPTION:   If the compiler fails to support foo

Эти комментарии обрабатываются по сценарию autoconf, поэтому убедитесь, что формат соответствует заданному. Файл должен быть назван «<boost_no_foo.ipp>», где foo — описание дефекта — попробуйте сохранить имя файла под ограничением имени файла символа Mac 30. Вам также потребуется предоставить функциональный прототип «<inttest()>», который заявлен в пространстве имен с тем же названием, что и макрос, но во всех нижних случаях, и который возвращает ноль на успех:

namespace boost_no_foo {
int test()
{
    // test code goes here:
    //
    return 0;
}
}

После того, как тестовый код установлен в libs/config/test, обновление системы тестирования конфигурации происходит следующим образом:

  • <libs/config/tools>,<bjam>и [<bjam>]. Это генерирует<.cpp>тестовые файлы из<.ipp>файла, обновляет libs/config/test/all/Jamfile.v2,<config_test.cpp>и<config_info.cpp>.

  • cd в<libs/config/test/all>и запустить<bjam >MACRONAME<compiler-list>, гдеMACRONAMEявляется названием нового макроса, а<compiler-list>представляет собой разделённый по пространству список компиляторов для тестирования.

    xxx_pass_test и xxx_fail_testдолжны сообщать<**passed**>.

    ЕслиMACRONAMEне определено, когда оно должно быть определено, xxx_pass_test не сообщит<**passed**>. ЕслиMACRONAMEопределено, когда оно не должно быть определено, xxx_fail_test не сообщит<**passed**>

    .
  • <libs/config/test>и запустить<bjam config_infoconfig_test ><compiler-list>.<config_info>должны построить и запустить чисто для всех компиляторов в<compiler-list>, в то время как<config_test>должны выйти из строя для тех, у кого есть дефект, и передать для тех, кто не.

Тогда вы должны:

  • Определите макрос дефекта в тех заголовках конфигураций, которые требуют этого.
  • Документируйте макрос в этой документации (пожалуйста, не забудьте этот шаг!!)
  • Совершайте все.
  • Следите за регрессионными тестами на новые сбои в Boost. Конфигурация, вызванная добавлением.
  • Начните использовать макрос.

Когда вам нужно добавить макрос, который описывает функцию, которая не требуется стандартом, следуйте соглашению для добавления нового макроса дефекта (выше), но вызовите макрос<BOOST_HAS_FOO>и назовите тестовый файл<boost_has_foo.ipp>. Не добавляйте макросы для тестирования функций без необходимости, если есть конкретный макрос платформы, который уже можно использовать (например,<_WIN32>,<__BEOS__>или<__linux>), чтобы идентифицировать функцию, а затем используйте эту функцию. Постарайтесь сохранить макрос в группе функций или имени заголовка, а не в одном конкретном API (например,<BOOST_HAS_NL_TYPES_H>, а не<BOOST_HAS_CATOPEN>). Если макрос описывает группу функций POSIX, то добавьте код boilerplate вдля автоматического обнаружения функции там, где это возможно (если вы задаетесь вопросом, почему мы не можем использовать макрос тестирования функций POSIX напрямую, помните, что многие из этих функций могут быть добавлены сторонними библиотеками, и поэтому не идентифицированы внутри<<unistd.h>>).

Цель настройки конфигурации бустера заключается в том, что заголовки конфигурации должны быть относительно стабильными - пользователю бустера не нужно повторно компилировать свой код только потому, что конфигурация для некоторого компилятора, который им не интересен, изменилась. Разделение конфигурации на отдельные разделы компилятора/стандартной библиотеки/платформы обеспечивает часть этой стабильности, но авторам бустеров также требуется некоторая сдержанность, в частности:

никогда не следует изменять, не меняйте этот файл.

включен по умолчанию, не добавляйте дополнительный код в этот файл, если вам не нужно. Если да, пожалуйста, не забудьте обновитьlibs/config/tools/configure.in.

всегда включен, поэтому будьте осторожны с изменением этого файла, поскольку он разрушает зависимости для всех. Этот файл должен содержать только код конфигурации «boilerplate» и, как правило, должен изменяться только при добавлении новых макросов.

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

Код выбора компилятора/платформы/стандартной библиотеки настроен так, что неизвестные платформы игнорируются и считаются полностью совместимыми со стандартами — это дает неизвестным платформам «спортивный шанс» работать «как есть» даже без запуска скрипта настройки.

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


PrevUpHomeNext

Статья Guidelines for Boost Authors раздела Boost.Config Boost.Config может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Boost.Config ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:24:36/0.011713981628418/1