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