关于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
- C++98/03标准:
- 但在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
相关产品推荐
相关产品推荐

