Как проверить поддержку C ++ 11? - PullRequest
97 голосов
/ 19 февраля 2011

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

#ifndef VARIADIC_TEMPLATES_SUPPORTED

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

#else

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

#endif

Ответы [ 10 ]

116 голосов
/ 01 июня 2012

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

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

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

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

54 голосов
/ 19 февраля 2011

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

37 голосов
/ 02 апреля 2015

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

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

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

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

31 голосов
/ 15 февраля 2016

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

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

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

#ifdef __cpp_user_defined_literals
20 голосов
/ 08 января 2016

Для проверки поддержки 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;
}
17 голосов
/ 28 января 2014

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

https://github.com/sloede/cxx11tests

15 голосов
/ 09 ноября 2016

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

#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, см. этот ответ ).

7 голосов
/ 13 декабря 2014

Если вы не хотите использовать 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

6 голосов
/ 19 февраля 2011

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

1 голос
/ 28 января 2018

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

Иногда проверка #if __cplusplus >= 201103L говорит вам, что вы используете C ++ 11, но другие настройки, такие как стандартная версия версии библиотеки в XCode, могут по-прежнему не иметь новых доступных библиотек (большинство из них доступны под разными именами, например, <tr1/array> )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...