Как проверить наличие поддержки C++20? Каково значение __cplusplus для С++ 20?

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

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

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

Каким должен быть ??? для С++ 20?


person user2296653    schedule 30.11.2018    source источник
comment
Тест на больше чем 2017 не работает?   -  person Antoine Morrier    schedule 30.11.2018
comment
@AntoineMorrier Конечно! Почему я не подумал об этом? Каким бы ни было значение для C++20, оно будет больше, чем для 17.   -  person user2296653    schedule 30.11.2018
comment
В большинстве случаев лучше протестировать функции, которые вы требуют, а не языковую версию.   -  person Toby Speight    schedule 30.11.2018
comment
@JerryCoffin Даже если бы это был дубликат, закрытие вопроса с использованием привилегии золотой медали, когда у связанного есть ваш ответ, кажется немного предвзятым ...   -  person Acorn    schedule 02.03.2021
comment
@Acorn: Учитывая то, сколько времени я был на SO, я опубликовал ответы на оригиналы множества вопросов. И то же самое почти неизбежно относится и к большинству других держателей золотых значков, поэтому кажется сомнительным, что это станет каким-то большим сюрпризом для SO или что-то в этом роде.   -  person Jerry Coffin    schedule 02.03.2021
comment
@JerryCoffin Возможно, но вы не опубликовали ответ на этот вопрос (это не дубликат). Закрытие его в одиночку после многих лет открытия и голосования выглядит довольно плохо. Кстати, не уверен, почему вы упоминаете ТАК.   -  person Acorn    schedule 02.03.2021
comment
@Acorn: Как ты понял, что это не дубликат? Я упоминаю ТАК, потому что это их сайт и их правила. Если бы я делал что-то странное, чтобы воспользоваться какой-нибудь лазейкой в ​​правилах (или чем-то в этом роде), имело бы смысл жаловаться — но, насколько я понимаю, то, что я сделал, было точно в соответствии с их правилами. собирались сделать.   -  person Jerry Coffin    schedule 02.03.2021


Ответы (3)


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

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

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

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

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

__cplusplus

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


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


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

person gsamaras    schedule 30.11.2018
comment
gcc 8.2 использует 201709 вместо c++2a, а clang 7.0 использует 201707 - person bolov; 30.11.2018
comment
То же самое для GCC 9 и Clang 8 @bolov, обновил мой ответ, спасибо! - person gsamaras; 30.11.2018
comment
Нехорошо копировать другие ответы после того, как у вас уже есть принятый и получивший наибольшее количество голосов ответ :-) - person Acorn; 30.11.2018
comment
Да, я согласен @Acorn. Однако обратите внимание, как некоторые люди параллельно улучшают свои ответы. Я вижу, что наши ответы имеют много общего, как и ваши с Курицей Сомбреро. Если вы считаете, что я должен изменить свой ответ, чтобы улучшить выгоду, которую будущий пользователь получит от чтения этого, дайте мне знать. В любом случае, если вы считаете, что вместо этого следует принять ваш, то нет проблем, ваш ответ очень хорош :) Также давайте очистим их позже, ради будущего пользователя, пожалуйста. - person gsamaras; 30.11.2018

Значение для C++20 равно 202002L, как вы можете видеть в [cpp.predefined ]p1.1:

_­_­cplusplus

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

Поэтому для компиляторов, которые уже реализуют новый стандарт, можно проверить:

#if __cplusplus >= 202002L
    // C++20 (and later) code
#endif

Это поддержка компилятора до сих пор:

Для тех, кто еще не реализовал его, вы можете вместо этого использовать:

#if __cplusplus > 201703L
    // C++20 (and later) code
#endif

Поскольку все компиляторы определяют его уже выше, чем 201703L в С++ 17 в соответствующем последнем режиме С++.

person Acorn    schedule 30.11.2018
comment
Конечно, вы хотите >= для теста 202002 года? Будем надеяться, что C++23 не нарушит большинство возможностей C++20… - person Davis Herring; 26.03.2020

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

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

__cplusplus

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

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

person Hatted Rooster    schedule 30.11.2018
comment
@gsamaras только потому, что ты вежливо попросил - person Hatted Rooster; 30.11.2018