Как определить версию стандарта C++ используется компилятор?
Как вы определяете, какая версия стандарта C++ реализована вашим компилятором? Насколько я знаю, ниже приведены стандарты, которые я знал:
- C++03
- C++98
6 ответов:
насколько мне известно, нет общего способа сделать это. Если вы посмотрите на заголовки кросс-платформенных / нескольких библиотек поддержки компиляторов, вы всегда найдете много of определяет, что использовать компилятор конкретных конструкций для определения таких вещей:
/*Define Microsoft Visual C++ .NET (32-bit) compiler */ #if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300) ... #endif /*Define Borland 5.0 C++ (16-bit) compiler */ #if defined(__BORLANDC__) && !defined(__WIN32__) ... #endif
вам, вероятно, придется сделать такие определения для всех компиляторов, которые вы используете.
от Бьярне Страуструпа C++0x FAQ:
__cplusplus
в C++0x макрос
__cplusplus
будет установлено значение, которое отличается от (больше чем) текущего199711L
.хотя это не так полезно, как хотелось бы.
gcc
(по-видимому, в течение почти 10 лет) это значение было установлено в1
, исключив один крупный компилятор, пока это было исправлено, когда gcc 4.7.0 пришел вон.это стандарты C++ и какое значение вы должны быть в состоянии ожидать в
__cplusplus
:
- C++ pre-C++98:
__cplusplus
и1
.- C++98:
__cplusplus
и199711L
.- C++98 + TR1: это читается как C++98 и нет никакого способа проверить, что я знаю.
- C++11:
__cplusplus
и201103L
.- C++14:
__cplusplus
и201402L
.- C++17:
__cplusplus
is201703L
.если компилятор может быть старше
gcc
, нам нужно прибегнуть к специфическому хакерству компилятора (посмотрите на макрос версии, сравните его с таблицей с реализованными функциями) или использовать импульс.Конфигурации (который обеспечивает соответствующие макросы). Преимущество этого заключается в том, что мы действительно можем выбрать конкретные функции нового стандарта и написать обходной путь, если эта функция отсутствует. Это часто предпочтительнее оптового решения, так как некоторые компиляторы будут утверждать, что реализуют C++11, но предлагают только подмножество функций.Вики Stdcxx размещает a комплексная матрица для поддержки компилятора функций C++0x (если вы осмелитесь проверить функции самостоятельно).
к сожалению, более мелкозернистая проверка функций (например, отдельные функции библиотеки, такие как
std::copy_if
) можно сделать только в системе сборки вашего приложения (запустите код с функцией, проверьте, скомпилирован ли он и произведен правильные результаты -autoconf
является инструментом выбора, если принимать этот маршрут).
в зависимости от того, чего вы хотите достичь, импульс.Конфигурации может помочь вам. Он не обеспечивает обнаружение стандартной версии, но предоставляет макросы, которые позволяют вам проверять поддержку определенных функций языка/компилятора.
пожалуйста, выполните следующий код, чтобы проверить версию.
#include<iostream> int main() { if (__cplusplus == 201402L) std::cout << "C++14\n"; else if (__cplusplus == 201103L) std::cout << "C++11\n"; else if (__cplusplus == 199711L) std::cout << "C++98\n"; else std::cout << "pre-standard C++\n"; }
после a быстрый google:
__STDC__
и__STDC_VERSION__
см. здесь