Как проверить поддержку C ++ 11?

Есть ли способ обнаружить во время компиляции, если компилятор поддерживает некоторые функции C ++ 11? Например, что-то вроде этого:

#ifndef VARIADIC_TEMPLATES_SUPPORTED #error "Your compiler doesn't support variadic templates. :(" #else template  class Tuple { // ... } #endif 

Boost.Config имеет множество макросов, которые можно использовать для тестирования поддержки определенных функций C ++ 11.

Существует константа с именем __cplusplus которую компиляторы C ++ должны установить на поддерживаемую версию стандарта C ++ .

 #if __cplusplus <= 199711L #error This library needs at least a C++11 compliant compiler #endif 

Он установлен в 199711L в Visual Studio 2010 с пакетом обновления 1 (SP1), но я не знаю, будут ли производители смело увеличивать его, если они имеют (частичную) поддержку на уровне компилятора по сравнению со стандартной библиотекой C ++ со всеми изменениями на C ++ 11 ,

Таким образом, определения Boost, упомянутые в другом ответе, остаются единственным разумным способом выяснить, есть ли, например, поддержка streamов C ++ 11 и других конкретных частей стандарта.

Как указано в стандарте C ++ 11 (§iso.16.8):

Имя __cplusplus определяется значением 201103L при компиляции единицы перевода C ++.

Со значением этого макроса вы можете проверить, соответствует ли компилятор C ++ 11.

Теперь, если вы ищете стандартный способ проверить, поддерживает ли компилятор какой-либо подмножество функций C ++ 11, я думаю, что нет стандартного портативного способа; вы можете проверить документацию компиляторов или файлы заголовков std, чтобы получить дополнительную информацию.

Я знаю, что это очень старый вопрос, но этот вопрос часто можно увидеть, и ответы немного устарели.

Новые компиляторы со стандартом C ++ 14 имеют стандартный способ проверки функций, включая возможности C ++ 11. Полная страница находится по адресу https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations

Таким образом, каждая функция имеет стандартный макрос, который можно проверить с помощью #ifdef . Например, чтобы проверить определенные пользователем литералы, вы можете использовать

 #ifdef __cpp_user_defined_literals 

Для проверки поддержки C ++ 14 и других. Тестирование на GCC 5.2.1.

 #include  int main(){ #if __cplusplus==201402L std::cout << "C++14" << std::endl; #elif __cplusplus==201103L std::cout << "C++11" << std::endl; #else std::cout << "C++" << std::endl; #endif return 0; } 

Я просто написал небольшой набор тестов, чтобы проверить, какие функции C ++ 11 поддерживаются конкретным компилятором. Тем не менее, это, конечно, «предварительная компиляция».

https://github.com/sloede/cxx11tests

Вы можете использовать это:

 #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900) cout << "C++11 is supported"; #else cout << "C++11 is not supported"; #endif 

Для 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 2015 макрос _MSC_VER имеет значение 1900 , см. этот ответ ).

Если вы не хотите использовать Boost.Config и вам нужно протестировать компиляторы, которые поддерживают C ++ 11, тогда проверка значения константы __cplusplus будет выполнена. Однако компилятор может поддерживать большинство популярных функций стандарта C ++ 11, но он не поддерживает все спецификации. Если вы хотите включить поддержку определенных компиляторов Visual Studio, которые еще не соответствуют стандарту C ++ 11, то используйте следующий fragment кода, который позволяет компилировать в Visual Studio 2013:

 #if defined(_MSC_VER) # if _MSC_VER < 1800 # error This project needs atleast Visual Studio 2013 # endif #elif __cplusplus <= 199711L # error This project can only be compiled with a compiler that supports C++11 #endif 

Полный список версий компилятора для Visual Studio предоставляется в разделе « Как определить, компилирую код с Visual Studio 2008»

В традиционном мире Linux / Unix autoconf традиционно используется для проверки наличия библиотек и особенностей компилятора и ошибок, помещая их в config.h, которые вы используете в своих файлах по мере необходимости.

Когда ваш чек предназначен для доступности библиотеки C ++ 11 (не для языка), например заголовок , вы можете #if __has_include() .

Иногда проверка #if __cplusplus >= 201103L скажет вам, что вы используете C ++ 11, но другие параметры, такие как установка стандартной версии библиотеки в Xcode, могут все еще не иметь доступных новых библиотек (большинство из них доступны в разных именах, т. )

Если у вас есть проблема с некоторыми функциями Visual Studio C ++, в Visual Studio вы устанавливаете стандарт языка C ++ в свойствах проекта: Свойства конфигурации -> C \ C ++ -> Язык: введите описание изображения здесь

Для дальнейших «определенных функций» вы можете включить экспериментальные модули на одну строку ниже.

  • 😃 (и другие символы Unicode) в идентификаторах, недопустимых g ++
  • Когда вы должны использовать функцию constexpr в C ++ 11?
  • Использование `std :: function ` для вызова функции non-void
  • Что такое std :: move (), и когда он должен использоваться?
  • C ++ 11 streamовая безопасность
  • проверить параметры вариационных шаблонов для уникальности
  • Разница в make_shared и normal shared_ptr в C ++
  • Не является ли аргумент шаблона (подпись) части std :: function его типа?
  • Что такое умный указатель, и когда я должен его использовать?
  • Сколько стоит слишком много с ключевым словом C ++ 11 auto?
  • Есть ли ошибка компилятора, представленная моей реализацией свойства is_complete?
  • Давайте будем гением компьютера.