"__cplusplus"宏扩展到什么?

What does the "__cplusplus" macro expand to?

本文关键字:什么 cplusplus 扩展到      更新时间:2023-10-16
  • C++宏__cplusplus包含和扩展到什么?

  • 即使在最旧的C++实现中,宏__cplusplus是否始终包含并扩展到数值

  • 使用#if __cplusplus安全吗还是我们应该用那个#ifdef __cplusplus代替?

<小时 />

结论(稍后添加(

从评论和接受的答案:

  • __cplusplus扩展到代表标准版本的数字,除了 90 年代初的试行标准C++(简单地扩展到 1 (。

  • 是的,即使在最旧的C++实现中(扩展到数值(。

  • 不,当标头与 C 语言共享时,应该使用 #ifdef(因为某些 C 编译器会在 #if 检查未定义的宏时发出警告(。

是的,它总是扩展到数值,其含义是正在使用C++标准的版本。根据 cpp首选项页面,__cplusplus宏应扩展到:

  • 199711L (至 C++11(,
  • 201103L (C++11(,
  • 201402L (C++14(,
  • 201703L (C++17(,
  • 202002L (C++20(

#if#ifdef 指令之间的区别在于,应使用#ifdef来检查是否已定义给定的宏以允许编译一段代码。

另一方面,#if(#else#elif(指令可以用来检查是否满足指定的条件(就像典型的if条件一样(。

__cplusplus需要由C++标准定义。对于C++11或更高,__cplusplus > 199711L应保持true


宏是否始终__cplusplus,即使在最旧的C++实现中, 包含并扩展到数值?

是的,确实如此。


19.8 C++11

__cplusplus

整数文本 201703L。 [ 注意:它旨在将来 本国际标准的版本将取代此标准的值 具有更大价值的宏。— 尾注 ]


C++98

__cplusplus 名称 _ 编译 C 时_cplusplus定义为值 199711L ++翻译单元。143(

不幸的是,无论指定的C++标准如何,__cplusplus宏都具有 MS Visual Studio 2022 中199711的值。请改用_MSVC_LANG。请参阅VS注释。

这似乎有效:

#if defined(_MSVC_LANG)  // MS compiler has different __cplusplus value.
#   if _MSVC_LANG < 201703
#       error Please compile for C++17 or higher
#   endif
#else  // All other compilers.
#   if __cplusplus < 201703
#       error Please compile for C++17 or higher
#   endif
#endif