Как определить версию стандарта С++, используемую компилятором?
Как вы определяете, какая версия стандарта С++ реализована вашим компилятором? Насколько я знаю, ниже приведены стандарты, которые я знаю:
Ответы
Ответ 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 может вам помочь. Он не обеспечивает обнаружение стандартной версии, но предоставляет макросы, которые позволяют вам проверять поддержку определенных функций языка/компилятора.
Ответ 5
После быстрый Google:
__STDC__
и __STDC_VERSION__
, см. здесь
Ответ 6
__ cplusplus
В С++ 0x макрос __cplusplus будет установлен в значение, которое отличается от (больше, чем) текущего 199711L.
С++ 0x FAQ по BS