Как проверить поддержку С++ 20? Какова ценность __cplusplus для С++ 20? - программирование
Подтвердить что ты не робот

Как проверить поддержку С++ 20? Какова ценность __cplusplus для С++ 20?

Связано с вопросами Как проверить поддержку C++ 11? и Какова ценность __cplusplus для C++ 17?

Как я могу узнать, может ли компилятор обрабатывать/настраивается для использования C++ 20? Я знаю, что в принципе можно запросить версию C++:

#if __cplusplus > ???
  // C++20 code here
#endif

Что должно ??? быть для C++ 20?

4b9b3361

Ответ 1

Это слишком рано для этого.

Пока стандарт не заменит его, используйте:

#if __cplusplus > 201703L
  // C++20 code
#endif

так как предопределенный макрос С++ 20 будет больше, чем у С++ 17.

Как упоминается ответ @SombreroChicken, [cpp.predefined] (1.1) указывает (внимание мое):

__cplusplus

Целый литерал 201703L. [Примечание. Предполагается, что будущие версии этого международного стандарта заменят значение этого макроса с большим значением.]


Используемые макросы по состоянию на ноябрь 2018 года:

  • GCC 9.0.0: 201709L для С++ 2a. Live demo
  • Clang 8.0.0: 201707L. Live demo
  • VC++ 15.9.3: 201704L (в качестве ответа @Acorn).

PS: Если вас интересуют конкретные функции, тогда [cpp.predefined] (1.8) определяет соответствующие макросы, которые вы могли бы использовать. Обратите внимание, однако, что они могут измениться в будущем.

Ответ 2

Новое значение будет доступно в некоторый момент в [cpp.predefined] p1.1:

__cplusplus

Целый литерал 201703L. [Примечание. Предполагается, что будущие версии этого международного стандарта заменят значение этого макроса на большее значение. - конечная нота]

Текущие значения, используемые в основных компиляторах, относятся к 2018-11-30 годам:

Поскольку все они уже выше С++ 17 201703L, вы уже можете использовать:

#if __cplusplus > 201703L
    // C++20 code
#endif

Ответ 3

Там неизвестной версии __cplusplus пока нет, потому что С++ 20 все еще находится в разработке. Есть только черновики для С++ 20.

Последний проект N4788 по- прежнему содержит:

__cplusplus

Целый литерал 201703L. [Примечание. Предполагается, что будущие версии этого международного стандарта заменят значение этого макроса на большее значение. -End note]

Что касается проверки, я бы использовал @gsamaras ответ.