Как определить версию стандарта C ++, используемую компилятором? - PullRequest
89 голосов
/ 24 февраля 2010

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

  • C ++ 03
  • C ++, 98

Ответы [ 6 ]

195 голосов
/ 20 августа 2011

Из 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 является инструментом выбора при выборе этого маршрута).

12 голосов
/ 26 июля 2018

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

#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";
}
9 голосов
/ 24 февраля 2010

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

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

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

6 голосов
/ 24 февраля 2010

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

3 голосов
/ 24 февраля 2010

__ cplusplus

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

C ++ 0x FAQ по BS

1 голос
/ 24 февраля 2010

После быстрого Google :

__STDC__ и __STDC_VERSION__, см. здесь

...