【发布时间】:2018-09-29 14:57:50
【问题描述】:
-
C++ 宏
__cplusplus包含什么并展开成什么? -
宏
__cplusplus是否总是(即使在最旧的 C++ 实现中)包含并扩展为 numeric 值? -
使用
#if __cplusplus安全吗? 还是我们应该使用#ifdef __cplusplus来代替?
结论(稍后添加)
来自 cmets 和接受的答案:
-
__cplusplus扩展为代表标准版本的数字,除了 90 年代初期的标准 C++(简单扩展为1)。 -
是的,即使在最旧的 C++ 实现中(扩展为数值)。
-
不,当标头与 C 语言共享时应该使用
#ifdef(因为某些 C 编译器会在#if检查未定义的宏时发出警告)。
【问题讨论】:
-
对于 C,它应该是未定义的(除非你正在与恶意编译器编写器打交道);对于 C++,它应该被定义,可能是一个有用的值,但至少被定义。如果您想使用“即使是最古老的 C++ 实现”,请不要假设“它已被定义”。
-
你认为什么是“最古老的 C++ 实现”? C++98?年纪大了?几岁?
-
该问题最初用 C 标记,并且标题包含“C”而不是 C++。不过,这些标签主要是 C++ 标签。但是,C11 §6.10.8 Predefined macro names ¶3 说:实现不应预定义宏
__cplusplus,也不应在任何标准头文件中定义它。 C99 标准说的基本相同,在一个稍微不同的部分。 C90 标准对这个问题保持沉默。 -
由于未定义的宏将扩展为假/零,我们只需要在定义时将 __cplusplus 评估为“真”,这样我们就可以缩短代码和条件
-
长期以来g++将其定义为1。#ifdef是传统的测试方式,如果你改用#if,一些编译器会发出警告。