在Visual Studio中定义与Typedef枚举发生冲突的原因是什么?
What is the reason for a define clashing with a typedef enum in visual studio?
我有一些代码,这些代码在这里看起来像这样的代码(当然,我简化了它)
#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通常被视为一个坏主意。这个问题说明了与使用它们相关的许多风险之一。请参阅问题为什么预处理宏是邪恶的,还有什么选择?
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 在Visual Studio中定义与Typedef枚举发生冲突的原因是什么?
- 该指针冲突的原因是什么?
- 解决运行时库冲突的好方法是什么?
- 从c#调用c++ DLL和访问冲突问题,我的选择是什么