我有一些代码,这里有一些看起来像这个的代码(我当然简化了)
#define ERROR 0
namespace lib{
class Logger{
public:
typedef enum {ERROR = 1} LogLevel;
};
}
Run Code Online (Sandbox Code Playgroud)
在visual studio中编译我得到错误:syntax error: 'constant'.很明显,问题是我重新使用了ERROR这个词作为define和typedef枚举.
有没有人知道定义的逻辑影响一些变量名称,它实际上包含在命名空间和类中.我的意思是,怎么可能ERROR混淆,lib::Logger::ERROR因为我的猜测是他们有完全不同的范围.
预#define编译器替换是编译代码时首先要做的事情之一.这些替换是以文本方式进行的,并忽略了c ++语法.您的代码相当于:
namespace lib{
class Logger{
public:
typedef enum {0 = 1} LogLevel;
};
}
Run Code Online (Sandbox Code Playgroud)
显而易见的是,在ERROR用0你的enum定义代替之后是不正确的.
如果任何其他机制可以做同样的工作,使用预处理器marcos通常被认为是一个坏主意.这个问题说明了使用它们的许多风险之一.请参阅问题为什么预处理器宏是邪恶的,有哪些替代方案?.
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |