枚举与UNICODE定义冲突 我正在研究一个C++项目(VC++),其中选择了“使用Unicode字符集”。p>

枚举与UNICODE定义冲突 我正在研究一个C++项目(VC++),其中选择了“使用Unicode字符集”。p>,c++,C++,这将设置UNICODE和_UNICODE。同时,包含的第三方.h文件恰好在枚举中包含“UNICODE”,这两个文件相互冲突 enum Encoding { ... UNICODE = 17, // Teragram Unicode ... } IDE抱怨“error C2059:syntax error:“constant”,因为我要在枚举中使用的UNICODE被转换为数字1。有什么办法可以转义枚举名吗?如何解决此问题?您可以添加一条语句: #undef

这将设置UNICODE和_UNICODE。同时,包含的第三方.h文件恰好在枚举中包含“UNICODE”,这两个文件相互冲突

enum Encoding {
  ...
  UNICODE              = 17,  // Teragram Unicode
  ...
}

IDE抱怨“error C2059:syntax error:“constant”,因为我要在枚举中使用的UNICODE被转换为数字1。有什么办法可以转义枚举名吗?如何解决此问题?

您可以添加一条语句:

#undef UNICODE

在枚举之前。这里的问题是UNICODE现在将是未定义的,因此例如,您的TCHAR将成为常规字符。对于枚举值来说,这是一个可怕的名称。为了避免这种情况,您必须在包含的顺序上做很多调整。

撇开效率不谈,这是c/c++枚举的一个真正缺点

每次我面对这样的问题,我都会尝试以下两种解决方案:

  • 添加名称空间以保护它们

  • 添加枚举名称的前缀:ENCODING_UNICODE


  • 由于
    \u UNICODE
    仍将是#define'd,如果
    \u UNICODE
    是#define'd,则可以在枚举后立即定义UNICODE。我假设第三方库中的代码不能修改。无论如何,你的建议肯定会有帮助。你可以自由修改库的.h文件,因为你的代码必须编译它们。我同意你的观点。我认为,每当我们声明类、结构、枚举等时,我们都必须使用名称空间来解决这个问题,同时也要使用格式良好的代码。如果人们停止用大写字母命名那些不是预处理器宏的东西,问题就不会那么严重了。名称空间解决不了这个问题,由于
    UNICODE
    是一个预编译器定义,因此不受名称空间的影响。如果未使用
    #unde
    语句,则需要在枚举上添加前缀。