在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上编译。
答案 0 :(得分:2)
你做不到。宏是一种生硬的工具,可以在C ++编译器开始工作之前完成所有损坏。这就是为什么最大限度地减少使用它们的原因。
假设您不希望重命名enum
,#undef NO_ERROR
,您可以enum
在push
之前以及在所有地方使用它。
有些工具集支持pop
和pragma
json_decode()
,这个想法并不太牵强。
答案 1 :(得分:0)
正如芭丝谢芭所说,你可以#undef
预定义的宏,但是,我不愿意这样做;一般来说:特别是如果值不相同的话。
但是,你还有另一个问题(即使使用#undef
也会导致你的编译失败):(经典)枚举常量的范围不是枚举,而是它的周围范围!因此,您需要通过ErrorCodes::Error::NO_ERROR
来引用您的枚举值,而不是ErrorCodes::NO_ERROR
。
如果你想要有范围的枚举(从C ++ 11开始),你需要:
namespace ErrorCodes
{
enum class Error
// ^^^^^
{
// ...
};
}