Как определить версию стандарта C++ используется компилятор?


Как вы определяете, какая версия стандарта C++ реализована вашим компилятором? Насколько я знаю, ниже приведены стандарты, которые я знал:

  • C++03
  • C++98
6 70

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 is 201703L.

если компилятор может быть старше 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__ см. здесь

__cplusplus

в C++0x макрос __cplusplus будет установлен в значение, которое отличается от (больше) текущего 199711L.

C++0x FAQ по BS