“__cplusplus”宏扩展为什么?

问题描述 投票:0回答:3
  • C++ 宏

    __cplusplus
    包含并扩展为什么?

  • __cplusplus
    是否始终(即使在最古老的C++实现中)包含并扩展为数字值?

  • 使用安全吗

    #if __cplusplus
    或者我们应该使用
    #ifdef __cplusplus
    来代替?


结论(稍后补充)

来自评论和接受的答案:

  • __cplusplus
    扩展为代表标准版本的数字,90 年代初的预标准 C++ 除外(仅扩展为
    1
    )。

  • 是的,即使在最古老的 C++ 实现中(扩展为数值)。

  • 不可以,当标头与 C 语言共享时应使用

    #ifdef
    (因为某些 C 编译器在
    #if
    检查未定义的宏时会发出警告)。

c++ c++11 macros
3个回答
13
投票

是的,它总是扩展为数值,其含义是正在使用的 C++ 标准的版本。根据 cppreference page

__cplusplus
宏应扩展为:

  • 199711L(直到 C++11),
  • 201103L(C++11),
  • 201402L(C++14),
  • 201703L(C++17),
  • 202002L(C++20)
  • 202302L(C++23)

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

另一方面,

#if
(
#else
,
#elif
) 指令可用于检查是否满足指定条件(就像典型的 if 条件一样)。


2
投票

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


即使在最古老的 C++ 实现中,宏 __cplusplus 是否始终如此? 包含并扩展为数值?

是的。


19.8C++11

__cplusplus

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


C++98

__cplusplus
名字 _ 编译 C 时,_cplusplus 被定义为值 199711L ++ 翻译单元。 143)


0
投票

不幸的是,无论指定的 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
© www.soinside.com 2019 - 2024. All rights reserved.