Подтвердить что ты не робот

Как утверждать, что С++ 11 следует использовать для компиляции моей программы?

Я хочу использовать некоторые функции С++ 11 в своей программе. Возможно, мне придется поделиться своим исходным кодом с другими в будущем. Как я могу утверждать внутри кода, что С++ 11 следует использовать для компиляции моей программы? Более старый компилятор может выдать ошибку, но я хочу, чтобы пользователь был четко информирован о том, что С++ 11 требуется.

Я использую следующие возможности С++ 11, если это имеет значение:

  • перечисление с указанным размером хранилища
  • std общий указатель

спасибо

4b9b3361

Ответ 1

Вы можете проверить, что значение макроса __cplusplus равно 201103L или больше:

#if __cplusplus < 201103L
#error This code requires C++11
#endif

С++ 11 16.8 Предварительно заданные имена макросов:

При реализации будут определены следующие имена макросов:

__cplusplus

При компиляции блока перевода С++ имя __cplusplus определяется значением 201103L. (155)

(155) Предполагается, что будущие версии этого стандарта заменят значение этого макроса на большее значение. Несогласованный компиляторы должны использовать значение с наименьшим числом десятичных цифр.

Ответ 2

__ cplusplus макрос может пригодиться

#if __cplusplus < 201103L
#error C++11 Required
#endif

Что-то вроде этого

Ответ 3

Как уже было сказано, правильным решением было бы проверить макрос __cplusplus. Однако некоторые компиляторы имеют частичную поддержку функций С++ 11, но не устанавливают этот макрос для правильного значения. Например, строго типизированные перечисления доступны в g++ с GCC 4.4.0. Однако с опцией -std=c++11 (и ее эквивалентами) макрос __cplusplus не был настроен на хорошее значение перед GCC 4.7.0 (вместо этого было установлено значение 1). Это означает, что некоторые компиляторы могут скомпилировать ваш код, но не будут, если вы проверите С++ 11 таким образом.

Если вам нужны только определенные функции, я бы проверил их с помощью Boost.Config, который определяет целый набор макросов, которые можно использовать для проверки того, поддерживает ли ваш компилятор требуемые функции. В вашем случае вам понадобится:

  • BOOST_NO_CXX11_SCOPED_ENUMS для строго типизированных перечислений.
  • BOOST_NO_CXX11_SMART_PTR для std::shared_ptr.