Как проверить наличие TR1 при компиляции?
Мы программируем библиотеку журналов, которая сохраняет себя в a .файл ГЭС. Мы хотели бы включить <tr1/unordered_map>
(если компилятор поддерживает TR1,) или Стандарт <map>
в противном случае. Существует ли стандартный способ проверки во время компиляции, доступен ли tr1 или нет?
Я думал, что так же, как присутствует символ определения "__cplusplus
", можно было бы определить "__cxx__tr1
" или что-то в этом роде. Я не видел этого в черновиках для TR1, поэтому предполагаю, что его нет, но я хотел бы сначала спроси на всякий случай.
В качестве примечания, если эти определения не существуют, было бы неплохо включить их в сами предложения.
5 ответов:
Если вы используете какие-либо инструменты настройки, такие как autotools, вы можете попробовать написать тест, например:
AC_CHECK_HEADER(tr1/unordered_map,[AC_DEFINE([HAVE_TR1],[],["Have tr1"])],[]) AC_CHECK_HEADER(unordered_map,[AC_DEFINE([HAVE_CXX0X],[],["Have C++0x"])],[])
И затем используйте эти определения в своем коде.
Вообще говоря
__cplusplus
макрос должен дать вам стандартный номер версии, но нет компилятора, который дает вам 100% стандартную реализацию... Таким образом пишем конфигурируем макросы.К сожалению, это единственный достаточно надежный способ проверить такие вещи, если вы не хотите написать 1001
#ifdef
для каждого компилятора (какой импульс делает)А затем:
#include "config.h" #ifdef HAVE_CXX0X # include <unordered_map> typedef std::unordered_map<foo,bar> my_map; #elif HAVE_TR1 # include <tr1/unordered_map> typedef std::tr1::unordered_map<foo,bar> my_map; #else # include <map> typedef std::map<foo,bar> my_map; #endif
Смотрите документ ISO C++ (WG21) N1575. Эта статья была удалена из TR1, без замены. Так что официального способа обнаружить TR1 не существует.
Одна библиотека, с которой я имею дело, должна использовать некоторые классы, добавленные в TR1 из Boost, предпочитая TR1, если он доступен. Решение (будучи библиотекой на базе Unix)состоит в том, чтобы засунуть проверки в сценарий configure.
Другими словами, нет, ничего портативного, насколько мне известно. Тем не менее, если вы находитесь на Unix, проверки сценария configure работают достаточно хорошо.