Ответ 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
. Я не помню, чтобы это определялось каким-либо значимым значением.