You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C++宏__cplusplus的展开值、特性及使用规范的技术问询

关于C++宏__cplusplus的常见疑问解答

嘿,关于__cplusplus这个宏的问题,我来给你梳理清楚:

1. __cplusplus宏的展开值与含义

这个宏是C编译器用来标识当前编译环境为C模式的标志性宏,它的展开结果主要用来区分C和C编译环境,同时也能体现当前编译器支持的C标准版本:

  • 对于标准C++来说,它会展开为对应标准版本的编码数字,比如:
    • C++98/03标准:199711L
    • C++11标准:201103L
    • C++14标准:201402L
    • C++17标准:201703L
    • C++20标准:202002L
    • C++23标准:202302L
  • 但在90年代早期的预标准C++实现(比如最早的Cfront编译器)里,这个宏的展开值很简单,就是1——当时还没有统一的标准版本编码,只是用这个值来标记“这是C++编译”。

2. 最早期C++实现中是否始终展开为数值?

没错,哪怕是最早期的那些预标准C++实现,__cplusplus也始终会展开成数值类型的常量,也就是前面说的1,不存在展开为非数值内容的情况。

3. #if __cplusplus vs #ifdef __cplusplus:哪个更安全?

这得分场景来看:

  • 如果你的代码需要兼容非常古老的预标准C实现(比如90年代初的版本),那#ifdef __cplusplus会更稳妥——它只检查这个宏是否存在,不管它的值是什么,只要是C环境就会生效。
  • 但如果是针对现代C++(C98及以后的标准实现),#if __cplusplus完全安全:因为C标准明确规定这个宏必须展开为正的数值常量,非零值在#if判断里会被视为真,能正确识别C环境。而且这种写法还有额外好处——你可以进一步判断具体的标准版本,比如用#if __cplusplus >= 201103L来检测编译器是否支持C11及以上特性。
  • 现在大多数日常开发场景下,两种写法都能正常工作,但如果要追求最极致的兼容性(包括那些古董级编译器),#ifdef会更靠谱;如果只需要兼容标准C++,#if反而更灵活。

补充结论

根据社区讨论和已验证的答案,__cplusplus通常展开为代表C标准版本的数字,但90年代早期的预标准C仅展开为1;即便是最早期的C++实现,它也始终是数值类型的展开结果,不存在非数值的情况。

内容的提问来源于stack exchange,提问作者Top-Master

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:57:34