我想取消定义并重新定义 __cplusplus 宏,但是编译错误:__cplusplus was not declared in this scope
#define TEMP_VERSION __cplusplus // temporary macro to hold the __cplusplus containt
#undef __cplusplus
#define __cplusplus TEMP_VERSION // redefine __cplusplus
#define AA 111
#undef AA
#define AA 111
int main()
{
cout << "__cplusplus = "<<__cplusplus<<endl; // It doesn't work
cout << "AA = "<<AA<<endl; // It works
return 0;
}
Run Code Online (Sandbox Code Playgroud)
__cplusplus与AA我知道这真的很难看,但是我取消定义宏的原因是我正在使用第三方软件,他们误用了#ifdef __cplusplus,我的意思是 的内容#ifdef __cplusplus ... #endif是错误的。因此,我没有更改他们的软件,而是选择执行以下操作
#define TEMP_VERSION __cplusplus
#undef __cplusplus
#include <third_party_sw.h>
#define __cplusplus TEMP_VERSION
Run Code Online (Sandbox Code Playgroud)
来自 C++ 标准 ([cpp.predefined, 3-4]):
预定义宏的值(除了
__FILE__和__LINE__)在整个翻译单元中保持不变。如果本小节中的任何预定义宏名称或定义的标识符是 #define 或 #undef 预处理指令的主题,则行为未定义。
换句话说,__cplusplus宏不仅仅是编译器在将控制权交给您之前通过定义开始的东西;它是一个不可变的常量,无法更改,尝试更改是错误的。
至于如果可能的话,这是否是一个好方法:取决于上下文,但可能不是。这些类型的“愚弄头”黑客(#define private public,有人吗?)很少有效并且永远不安全。
编辑:哦,顺便说一句,即使你确实有一个宏,保存/恢复也是合法的,这也不是正确的方法。请参阅我可以重新定义 C++ 宏然后重新定义它吗?.