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

Как определяется директива __cplusplus в разных компиляторах?

Мой компилятор расширяет его до 199711L. Что это значит? Я читал, что __cplusplus > 199711L означает С++ 11. Каковы возможные расширения этого макроса и что это означает?

4b9b3361

Ответ 1

199711L означает год = 1997, месяц = ​​11 (т.е. ноябрь 1997 года) - дата, когда комитет утвердил стандарт, который остальная часть ИСО одобрила в начале 1998 года.

Для стандарта 2003 года было достаточно мало изменений, которые комитет (по-видимому) решил оставить без изменений.

Для стандарта 2011 года его необходимо определить как 201103L (опять же, год = 2011, месяц = ​​03), что означает, что комитет утвердил стандарт, который был завершен в марте 2011 года.

Для стандарта 2014 он должен быть определен как 201402L, интерпретируется так же, как указано выше (февраль 2014 года).

Для стандарта 2017 он должен быть определен как 201703L (март 2017 г.).

До того, как был утвержден первоначальный стандарт, довольно много компиляторов обычно определяли его на 0 (или просто пустое определение типа #define __cplusplus), чтобы обозначить "несоответствие". Когда его спросили о его самом строгом соответствии, многие определили его на 1.

Я почти забыл упомянуть, но еще один лакомый кусочек о древних компиляторах: несколько самых ранних версий cfront (и, вероятно, некоторые другие, копирующие его) определили c_plusplus вместо __cplusplus. Я не помню, чтобы это определялось каким-либо значимым значением.

Ответ 2

Я думаю, что определение препроцессора для различных версий должно идти в SD-6:

#define __cpp_1997 199711L
#define __cpp_2003 __cpp_1997
#define __cpp_2011 201103L
#define __cpp_2014 201402L
#define __cpp_2017 201703L

Глядя в 2020-е годы, у нас может быть еще три стандарта. Я не сомневаюсь, что многие разработчики будут иметь стандарты, поддерживающие код, начиная с 1997 года.

Я, например, хотел бы определить мнемонику, чтобы мне не приходилось возвращаться к этому посту.

Ответ 3

Это означает, что он совместим с стандартом С++ 1997 года (фактически известным как С++ '98, поскольку они слишком долго его ратифицировали).

Ответ 4

Чтобы ответить на заголовок вопроса, позвольте мне указать вам коллекцию типичных компиляторов. Если вы оставите флаги компилятора по умолчанию, будут выбраны следующие стандартные версии C++:

https://gist.github.com/ax3l/53db9fa8a4f4c21ecc5c4100c0d93c94