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

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

  • С++ 03
  • С++ 98

Ответ 1

По моим сведениям, нет общего способа сделать это. Если вы посмотрите на заголовки кросс-платформенных/многокомпонентных библиотек, поддерживающих компилятор, вы всегда найдете много из определений, которые используют специфические для компилятора конструкции для определения таких вещей:

/*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

Вам, вероятно, придется делать такие определения самостоятельно для всех компиляторов, которые вы используете.

Ответ 2

Из Bjarne Stroustrup С++ 0x FAQ:

__cplusplus

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

Хотя это не так полезно, как хотелось бы. gcc (видимо, в течение почти 10 лет) было установлено это значение 1, исключая один главный компилятор, до он был исправлен, когда появился gcc 4.7.0 из.

Это стандарты С++ и какое значение вы должны ожидать в __cplusplus:

  • С++ pre-С++ 98: __cplusplus is 1.
  • С++ 98: __cplusplus есть 199711L.
  • С++ 98 + TR1: Это читается как С++ 98, и нет способа проверить, что я знаю.
  • С++ 11: __cplusplus is 201103L.
  • С++ 14: __cplusplus is 201402L.
  • С++ 17: __cplusplus is 201703L.

Если компилятор может быть старше gcc, нам нужно обратиться к специфическому хакерству компилятора (посмотрите на макрос версии, сравните его с таблицей с реализованными функциями) или используйте Boost.Config (который предоставляет соответствующие макросы). Преимущество этого в том, что мы действительно можем выбрать конкретные функции нового стандарта и написать обходное решение, если эта функция отсутствует. Это часто предпочтительнее для оптового решения, поскольку некоторые компиляторы будут требовать реализации С++ 11, но предлагают только набор функций.

В Stdcxx Wiki размещается всеобъемлющая матрица для поддержки компилятора функций С++ 0x (если вы решитесь проверить сами функции).

К сожалению, более мелкозернистая проверка функций (например, отдельных библиотечных функций, таких как std::copy_if) может выполняться только в системе сборки вашего приложения (запустить код с помощью функции, проверить, скомпилирована ли она и получить правильные результаты - autoconf является инструментом выбора, если брать этот маршрут).

Ответ 3

Пожалуйста, запустите следующий код, чтобы проверить версию.

#include<iostream>

int main() {
    if (__cplusplus == 201703L) std::cout << "C++17\n";
    else 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";
}

Ответ 4

В зависимости от того, чего вы хотите достичь, Boost.Config может вам помочь. Он не обеспечивает обнаружение стандартной версии, но предоставляет макросы, которые позволяют вам проверять поддержку определенных функций языка/компилятора.

Ответ 6

__ cplusplus

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

С++ 0x FAQ по BS