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



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



#ifndef VARIADIC_TEMPLATES_SUPPORTED

#error "Your compiler doesn't support variadic templates. :("

#else

template <typename... DatatypeList>
class Tuple
{
// ...
}

#endif
669   10  

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 поддерживаются конкретным компилятором. Однако это, конечно, проверка "перед компиляцией".

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). 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

    Ничего не найдено.