Из Bjarne Stroustrup C ++ 0x FAQ :
__cplusplus
В C ++ 0x макрос
blockquote>__cplusplus
будет установлено значение, которое отличается от (больше) текущего199711L
.Хотя это не так полезно, как хотелось бы.
gcc
(видимо, в течение почти 10 лет) это значение было установлено на1
, исключая один главный компилятор, до тех пор, пока он не был зафиксирован, когда gcc 4.7.0 вышел .Это стандарты C ++ и какое значение вы должны ожидать в
__cplusplus
:
- C ++ pre-C ++ 98:
__cplusplus
is1
.- C ++ 98:
__cplusplus
is199711L
.- C ++ 98 + TR1: Это читается как C ++ 98, и нет способа проверить, что я знаю.
- C ++ 11:
__cplusplus
is201103L
.- C ++ 14:
__cplusplus
is201402L
.- C ++ 17 :
__cplusplus
is201703L
.Если компилятор может быть старше
gcc
, нам нужно обратиться к специфическому хакерству компилятора (посмотрите на макрос версии, сравните его с таблица с реализованными функциями) или используйте Boost.Config (который предоставляет соответствующие макросы ). Преимущество этого в том, что мы действительно можем выбрать конкретные функции нового стандарта и написать обходное решение, если эта функция отсутствует. Это часто предпочтительнее для оптового решения, так как некоторые компиляторы будут требовать реализовать C ++ 11, но предлагают только набор функций.В Stdcxx Wiki размещена всеобъемлющая матрица для поддержки компилятора из функций C ++ 0x (если вы решились проверить сами функции).
К сожалению, более мелкозернистая проверка функций (например, отдельные функции библиотеки, такие как
std::copy_if
) может выполняться в системе сборки вашего приложения (запустить код с помощью функции, проверить, скомпилирован ли он и получить правильные результаты -autoconf
является инструментом выбора при прохождении этого маршрута).