我有一些代码,这些代码在这里看起来像这样的代码(当然,我简化了它)
#define ERROR 0
namespace lib{
class Logger{
public:
typedef enum {ERROR = 1} LogLevel;
};
}
在Visual Studio中编译时,我会收到错误:syntax error: 'constant'
。显然,问题是我正在重复使用定义和typedef枚举的单词错误。
任何人都知道定义的逻辑影响了某些可变名称,这些名称被包括在名称空间和类中。我的意思是,如何将ERROR
与lib::Logger::ERROR
混淆,因为我的猜测是它们具有完全不同的范围。
预处理器#define
替换是您编译代码时发生的第一件事。这些替代是在文本上进行的,并忽略了C 语法。您的代码等同于:
namespace lib{
class Logger{
public:
typedef enum {0 = 1} LogLevel;
};
}
很明显,在用ERROR
替换CC_5之后,您的enum
定义不正确。
如果其他任何机制可以做相同的工作,使用预处理器Marcos通常被视为一个坏主意。这个问题说明了与使用它们相关的许多风险之一。请参阅问题为什么预处理宏是邪恶的,还有什么选择?