Как вы определяете, какая версия стандарта С++ реализована вашим компилятором? Насколько я знаю, ниже приведены стандарты, которые я знаю:
- С++ 03
- С++ 98
Как вы определяете, какая версия стандарта С++ реализована вашим компилятором? Насколько я знаю, ниже приведены стандарты, которые я знаю:
По моим сведениям, нет общего способа сделать это. Если вы посмотрите на заголовки кросс-платформенных/многокомпонентных библиотек, поддерживающих компилятор, вы всегда найдете много из определений, которые используют специфические для компилятора конструкции для определения таких вещей:
/*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
Вам, вероятно, придется делать такие определения самостоятельно для всех компиляторов, которые вы используете.
Из Bjarne Stroustrup С++ 0x FAQ:
__cplusplus
В С++ 0x макрос
__cplusplus
будет установлен в значение, которое отличается от (больше) тока199711L
.
Хотя это не так полезно, как хотелось бы. gcc
(видимо, в течение почти 10 лет) было установлено это значение 1
, исключая один главный компилятор, до он был исправлен, когда появился gcc 4.7.0 из.
Это стандарты С++ и какое значение вы должны ожидать в __cplusplus
:
__cplusplus
is 1
.__cplusplus
есть 199711L
.__cplusplus
is 201103L
.__cplusplus
is 201402L
.__cplusplus
is 201703L
.Если компилятор может быть старше gcc
, нам нужно обратиться к специфическому хакерству компилятора (посмотрите на макрос версии, сравните его с таблицей с реализованными функциями) или используйте Boost.Config (который предоставляет соответствующие макросы). Преимущество этого в том, что мы действительно можем выбрать конкретные функции нового стандарта и написать обходное решение, если эта функция отсутствует. Это часто предпочтительнее для оптового решения, поскольку некоторые компиляторы будут требовать реализации С++ 11, но предлагают только набор функций.
В Stdcxx Wiki размещается всеобъемлющая матрица для поддержки компилятора функций С++ 0x (если вы решитесь проверить сами функции).
К сожалению, более мелкозернистая проверка функций (например, отдельных библиотечных функций, таких как std::copy_if
) может выполняться только в системе сборки вашего приложения (запустить код с помощью функции, проверить, скомпилирована ли она и получить правильные результаты - autoconf
является инструментом выбора, если брать этот маршрут).
Пожалуйста, запустите следующий код, чтобы проверить версию.
#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";
}
В зависимости от того, чего вы хотите достичь, Boost.Config может вам помочь. Он не обеспечивает обнаружение стандартной версии, но предоставляет макросы, которые позволяют вам проверять поддержку определенных функций языка/компилятора.
После быстрый Google:
__STDC__
и __STDC_VERSION__
, см. здесь
__ cplusplus
В С++ 0x макрос __cplusplus будет установлен в значение, которое отличается от (больше, чем) текущего 199711L.