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

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

5 ответов

Решение

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

Я думаю, что определение препроцессора для различных версий должно идти в 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 года.

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

Значение __cplusplus для C++20

Согласно ответу Acorn, __cplusplus - это макрос, определенный как 202002 на основе ссылки cpp.predefined(1.1)! Это определение также можно найти по этой ссылке! Искать __cplusplus

С тех пор он был обновлен до 202004 г.

Чтобы узнать его реальную ценность для Microsoft Visual C++ в сообществе Visual Studio 2019, сделайте следующее:

  • Создать проект Visual C++
  • Щелкните правой кнопкой мыши Решение.
  • В раскрывающемся меню нажмите «Свойства» внизу.
  • Откроется всплывающее диалоговое окно
  • Щелкните "Свойства конфигурации", чтобы развернуть его.
    • Щелкните "C / C++", чтобы развернуть его.
      • Щелкните «Все параметры».
        • Вы должны найти "Дополнительные параметры" справа.
          • В соседнем правом столбце этой вставки: / std: c ++latest /Zc:__ cplusplus

Нажмите кнопку «Применить», а затем кнопку «ОК».

В функции main() запустите следующий код, чтобы получить значение __cplusplus

      int main()
{
    long cppVer = __cplusplus;
    std::cout << "__cplusplus value for C++20 is: ";
    std::cout << std::to_string( cppVer ) << std::endl;
}

Код должен отображать следующее:

      __cplusplus value for C++20 is: 202004

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

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

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

Другие вопросы по тегам