宏NO_ERROR冲突

时间:2018-03-12 14:37:22

标签: c++ macros

winerror.h

...
#define NO_ERROR 0L // dderror    
...                                         

ErrorHelper.h

...
namespace ErrorCodes
{
    enum Error
    {
        NO_ERROR = 0,// Not an error
        ...
    }
}
...

即使在#undef NO_ERROR之前写入了namepsace,冲突仍会出现。

怎样才能摆脱这种宏观冲突?

以这种方式绕过宏有可能吗?

#define min(a,b)            (((a) < (b)) ? (a) : (b))
...
(std::min)(a, b); // std::min used instead of evil macro

ErrorCodes::Error::NO_ERROR;的每一行都出现错误:

Error   C2059   syntax error: '::'  

Error   C2589   'constant': illegal token on right side of '::' 

Visual Studio Compiler发生此冲突,但在Linaro GCC Snapshot 6.2-2016.11上编译。

2 个答案:

答案 0 :(得分:2)

你做不到。宏是一种生硬的工具,可以在C ++编译器开始工作之前完成所有损坏。这就是为什么最大限度地减少使用它们的原因。

假设您不希望重命名enum#undef NO_ERROR,您可以enumpush之前以及在所有地方使用它。

有些工具集支持poppragma json_decode(),这个想法并不太牵强。

答案 1 :(得分:0)

正如芭丝谢芭所说,你可以#undef预定义的宏,但是,我不愿意这样做;一般来说:特别是如果值不相同的话。

但是,你还有另一个问题(即使使用#undef也会导致你的编译失败):(经典)枚举常量的范围不是枚举,而是它的周围范围!因此,您需要通过ErrorCodes::Error::NO_ERROR来引用您的枚举值,而不是ErrorCodes::NO_ERROR

如果你想要有范围的枚举(从C ++ 11开始),你需要:

namespace ErrorCodes
{
    enum class Error
    //   ^^^^^
    {
        // ...
    };
}