Как проверить наличие поддержки C++11?
Есть ли способ определить во время компиляции, поддерживает ли компилятор определенные функции C++11? Например, что-то вроде этого:
#ifndef VARIADIC_TEMPLATES_SUPPORTED
#error "Your compiler doesn't support variadic templates. :("
#else
template <typename... DatatypeList>
class Tuple
{
// ...
}
#endif
10 ответов:
Толчок.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 SP1, но я не знаю, будут ли поставщики настолько смелы, чтобы увеличить его уже, если у них есть только (частичная) поддержка на уровне компилятора по сравнению со стандартной библиотекой C++ со всеми изменениями C++11.
Таким образом, определения Boost, упомянутые в другом ответе, остаются единственным разумным способом выяснить, есть ли, например,, поддержка потоков 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 <iostream> 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). Studio 2015, макрос_MSC_VERимеет значение1900, см. этот ответ ).
Если вы не хотите использовать Boost.Config и нужно протестировать для компиляторов, поддерживающих C++11, то проверка значения константы
__cplusplusбудет делать. Однако компилятор может поддерживать большинство популярных функций стандарта C++11, но он не поддерживает все спецификации. Если вы хотите включить поддержку определенных компиляторов Visual Studio, которые еще не на 100% совместимы со спецификациями C++11, используйте следующий фрагмент кода, который позволяет компилировать в 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 традиционно используется для проверки наличия библиотек и функций компилятора, а также ошибок, помещающих их в конфигурацию.h которые вы используете в своих файлах по мере необходимости.
Когда вы проверяете доступность библиотеки C++11 (не языковой функции), например заголовка
<array>, вы можете#if __has_include(<array>).Иногда проверка
#if __cplusplus >= 201103Lговорит вам, что вы используете C++11, но другие настройки, такие как настройка версии стандартной библиотеки в Xcode, могут все еще не иметь новых доступных библиотек (большинство из них доступны под разными именами ie<tr1/array>)
Comments