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