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

Существует ли стандартное определение __cplusplus в С++ 14?

Я хочу настроить некоторые материалы для препроцессора, и мне бы хотелось, чтобы более точное число, для которого __cplusplus в С++ 14 должно быть определено как. Есть ли какой-либо мандат по стандарту?

4b9b3361

Ответ 1

N3936 * §16.8 [cpp.predefined]/p1:

1 Следующие имена макросов должны быть определены реализацией:

__cplusplus

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

N3936 является окончательным рабочим проектом, который стал C++ 14, а номер 201402L соответствует совещанию, на котором стандарт C++ 14 разослан для окончательного голосования (февраль 2014 года).

* Те, кто заинтересован в получении копии стандарта C++, должны проверить Где я могу найти текущие стандартные документы C или C++?

Ответ 2

cppreference содержит информацию о стандартных значениях макроса __cplusplus в разделе "Предопределенные макросы". В настоящее время стандартные значения:

199711L (С++ 98 или С++ 03)
201103L (С++ 11)
201402L (С++ 14)
201703L (С++ 17)

К вашему сведению, значение макроса для любой данной версии не установлено до тех пор, пока не будет опубликован окончательный стандарт. Таким образом, по состоянию на июнь 2019 года невозможно узнать, каким будет значение макроса для С++ 2a.

Поставщики библиотек обычно предоставляют свои возможности "С++ 2a" на #if __cplusplus > 201703L.

Поставщики компиляторов с режимом "С++ 2a" просто выбирают любое произвольное значение для __cplusplus, что делает проверки __cplusplus > 201703L поставщиков библиотек счастливыми:

Режим GCC (8.x, 9.x и транк) -std=c++2a устанавливает __cplusplus == 201709L.
Режим Clang (5.x, 6.x, 7.x, 8.x и транк) -std=c++2a устанавливает __cplusplus == 201707L.
Microsoft Visual Studio (19.20) Режим /std:c++latest устанавливает __cplusplus == 201705L тогда и только тогда, когда вы передаете /Zc:__cplusplus! В противном случае он использует 199711L. Так что следите за этим!

Как исторически обрабатывались переходы?:

Clang 4.0.1 -std=c++1z установить __cplusplus == 201406L. Clang 5.0.0 представил -std=c++17, сделал -std=c++1z синонимом для -std=c++17 и увеличил размер макроса (независимо от того, какой из 17/1z вы использовали) до стандартного значения 201703L.

GCC 5.1 представил -std=c++1z и -std=c++17 как синонимы вне шлюза, установив __cplusplus == 201500L. Между GCC 6.4 и GCC 7.1 макрос был увеличен (независимо от того, какое правописание вы использовали) до стандартного значения 201703L.

Как ни странно, согласно Godbolt Compiler Explorer, MSVC изменил макрос для режима -std:c++latest с 201704L на 201705L где-то между MSVC 19.16 и 19.20.