Как проверить поддержку C ++ 11?
Есть ли способ обнаружить во время компиляции, если компилятор поддерживает некоторые функции C ++ 11? Например, что-то вроде этого:
#ifndef VARIADIC_TEMPLATES_SUPPORTED #error "Your compiler doesn't support variadic templates. :(" #else template class Tuple { // ... } #endif
- Как включить C ++ 11 в gcc?
- Сравнение трех современных методов c ++ для преобразования целочисленных значений в строки
- Производятся ли конструкторы перемещения автоматически?
- Как создать события таймера с помощью C ++ 11?
- Разница между std :: reference_wrapper и простым указателем?
- Какие различия, если таковые имеются, между C ++ 03 и C ++ 11 могут быть обнаружены во время выполнения?
- Нужны ли ссылки rvalue на const?
- C ++ 11: Замените все необработанные указатели на std :: shared_ptr ()?
- Как включить поддержку C ++ 11 / C ++ 0x в Eclipse CDT?
- Как захватить unique_ptr в выражение lambda?
- Будет ли std :: string всегда заканчиваться на null в C ++ 11?
- Что произойдет, если значение static_cast недопустимо для classа enum?
- Почему emplace_back () не использует равномерную инициализацию?
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 поддерживаются конкретным компилятором. Тем не менее, это, конечно, «предварительная компиляция».
Вы можете использовать это:
#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 ++ -> Язык:
Для дальнейших «определенных функций» вы можете включить экспериментальные модули на одну строку ниже.