Я хочу настроить некоторые материалы для препроцессора, и мне бы хотелось, чтобы более точное число, для которого __cplusplus
в С++ 14 должно быть определено как. Есть ли какой-либо мандат по стандарту?
Существует ли стандартное определение __cplusplus в С++ 14?
Ответ 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.