Как проверить поддержку С++ 20? Какова ценность __cplusplus для С++ 20?
Связано с вопросами Как проверить поддержку C++ 11? и Какова ценность __cplusplus для C++ 17?
Как я могу узнать, может ли компилятор обрабатывать/настраивается для использования C++ 20? Я знаю, что в принципе можно запросить версию C++:
#if __cplusplus > ???
// C++20 code here
#endif
Что должно ???
быть для C++ 20?
Ответы
Ответ 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 ответ.