Есть ли способ определить во время компиляции, поддерживает ли компилятор определенные функции C ++ 11? Например, примерно так:
#ifndef VARIADIC_TEMPLATES_SUPPORTED
#error "Your compiler doesn't support variadic templates. :("
#else
template <typename... DatatypeList>
class Tuple
{
// ...
}
#endif
template <typename... Test> struct compiler_must_support_variadic_templates;
. Синтаксическая ошибка быстро выявит проблему. (Ответы:
Существует константа с именем,
__cplusplus
которую компиляторы C ++ должны установить для версии поддерживаемого стандарта C ++, см. ЭтоВ Visual Studio 2010 с пакетом обновления 1 (SP1) для него установлено значение 199711L, но я не знаю, будут ли поставщики настолько смелыми, чтобы уже увеличивать его, если у них просто (частичная) поддержка уровня компилятора по сравнению со стандартной библиотекой C ++ со всеми изменениями C ++ 11. .
Таким образом, определения Boost, упомянутые в другом ответе, остаются единственным разумным способом выяснить, есть ли, например, поддержка потоков C ++ 11 и других конкретных частей стандарта.
источник
__cplusplus
в201103L
. Это подтверждает полное соответствие стандарту 2011 года; он не говорит вам о частичном соответствии или расширениях компилятора. Если__cplusplus
установлено значение201103L
, то либо компилятор полностью соответствует требованиям, либо он вам лжет. Если это не так, то вы не сможете точно сказать, какие функции он поддерживает.-std=c++11
указана опция (также может быть-std=gnu++11
). Они делают это, даже если они не совсем полнофункциональные (4.8 делает нас намного ближе). Обратите внимание: существует разрыв между тем, что поддерживает компилятор, и тем, что доступно в стандартной библиотеке. В 4.7.x и 4.8.x в настоящее время отсутствует поддержка регулярных выражений, но это библиотека, а не функция компилятора.__cplusplus
для199711L
для C ++ 11.__cplusplus
для199711L
которого установлено значение, не соответствует компилятору C ++ 11. У них, вероятно, есть варианты, чтобы заставить их вести себя правильно.Как указано в стандарте C ++ 11 (§iso.16.8):
С помощью значения этого макроса вы можете проверить, соответствует ли компилятор C ++ 11.
Теперь, если вы ищете стандартный способ проверить, поддерживает ли компилятор какое-либо подмножество функций C ++ 11, я думаю, что нет стандартного переносимого способа; вы можете проверить документацию компилятора или заголовочные файлы библиотеки std, чтобы получить дополнительную информацию.
источник
Я знаю, что это очень старый вопрос, но этот вопрос можно часто встретить, и ответы на него немного устарели.
Новые компиляторы со стандартом C ++ 14 имеют стандартный способ проверки функций, включая функции C ++ 11. Подробная страница находится по адресу https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations.
Таким образом, для каждой функции определен стандартный макрос, с которым вы можете проверить
#ifdef
. Например, чтобы проверить определенные пользователем литералы, вы можете использоватьисточник
__has_include()
макрос.Для проверки поддержки C ++ 14 и прочего. Тестирование на GCC 5.2.1.
источник
Вы можете использовать это:
Для C ++ 11 большинство компиляторов, за исключением Visual Studio, устанавливают
__cplusplus
макрос в значение201103L
, но любая версия Visual Studio устанавливает его в199711L
значение, которое использовалось для других компиляторов до C ++ 11. Этот код сравнивает_cplusplus
макрос со201103L
всеми компиляторами, кроме Visual Studio, и если это Visual Studio, он проверяет, является ли версия Visual Studio более поздней, чем 2015, первая версия Visual Studio, которая полностью поддерживает C ++ 11 (для Visual Studio Studio 2015,_MSC_VER
макрос имеет значение1900
, см. Этот ответ ).источник
g++ -std=c++98
с GCC 4.8 он неправильно печатаетC++11 is supported
.Если вы не хотите использовать Boost.Config и вам нужно протестировать компиляторы, поддерживающие C ++ 11, тогда
__cplusplus
подойдет проверка значения константы . Однако компилятор может поддерживать большинство популярных функций стандарта C ++ 11, но не поддерживает все спецификации. Если вы хотите включить поддержку определенных компиляторов Visual Studio, которые еще не на 100% соответствуют спецификациям C ++ 11, используйте следующий фрагмент кода, который позволяет компилировать в Visual Studio 2013:Полный список версий компилятора для Visual Studio приведен в разделе Как определить, компилирую ли я код с помощью Visual Studio 2008.
источник
В традиционном мире Linux / Unix autoconf традиционно используется для проверки наличия библиотек и функций компилятора и размещения ошибок в config.h, который вы используете в своих файлах по мере необходимости.
источник
Если ваша проверка касается наличия библиотеки C ++ 11 (не языковой функции), например
<array>
заголовка, вы можете#if __has_include(<array>)
.Иногда проверка
#if __cplusplus >= 201103L
может сказать вам, что вы используете C ++ 11, но другие настройки, такие как настройка версии стандартной библиотеки в Xcode, могут по-прежнему не иметь доступных новых библиотек (большинство из них доступны под разными именами, т.е.<tr1/array>
)источник