gpt4 book ai didi

c++ - 取消定义和重新定义 __cplusplus 宏

转载 作者:行者123 更新时间:2023-11-30 00:43:32 25 4
gpt4 key购买 nike

我想取消定义并重新定义 __cplusplus 宏,但出现编译错误:__cplusplus 未在此范围内声明

#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;
}
  • 问题 1:为什么它不能使用 __cplusplus 但可以使用 AA

我知道这真的很难看,但我取消定义宏的原因是我使用的是第三方软件,他们误用了 #ifdef __cplusplus,我的意思是 #ifdef __cplusplus ... #endif 是错误的。因此,我没有更改他们的软件,而是选择执行以下操作

#define TEMP_VERSION __cplusplus
#undef __cplusplus
#include <third_party_sw.h>
#define __cplusplus TEMP_VERSION
  • 问题 2:您认为这是一个好的方法吗?

最佳答案

来自 C++ 标准([cpp.predefined, 3-4]):

The values of the predefined macros (except for __FILE__ and __LINE__) remain constant throughout the translation unit. If any of the pre-defined macro names in this subclause, or the identifier defined, is the subject of a #define or a #undef preprocessing directive, the behavior is undefined.

换句话说,__cplusplus 宏不仅仅是编译器在将控制权移交给您之前通过定义开始的东西;它是一个不可变常量,无法更改,尝试更改是错误的。

至于如果可能的话这是否是一个好方法:取决于上下文,但可能不是。这些“愚弄 header ”的技巧(#define private public,有人知道吗?)很少有效而且永远不安全。

编辑:哦,顺便说一句,即使您确实有一个宏,保存/恢复也是合法的,但这不是正确的方法。参见 Can I redefine a C++ macro then define it back? .

关于c++ - 取消定义和重新定义 __cplusplus 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53707526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com