2013-05-17 65 views
0

我正在选择“使用Unicode字符集”的C++项目(VC++)。enum与UNICODE冲突定义

enter image description here

这台UNICODE和_UNICODE。同时,包含的第三方.h文件恰好在枚举中包含“UNICODE”,并且这两者是冲突的。

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

的IDE抱怨“错误C2059:语法错误:‘常量’,因为我想在枚举使用UNICODE被变成了1号。请问有什么办法可以逃脱枚举的名字吗?我该如何解决这个问题?枚举之前

#undef UNICODE 

回答

1

您可以添加的声明。这里的问题是,UNICODE现在将被定义为未定义的,例如,您的TCHAR将成为常规字符。这是一个枚举值的可怕名字。为了避免这种情况,你将不得不围绕包含的顺序进行游戏。

+1

由于'_UNICODE'仍然会#define'd,你可以'#定义UNICODE'枚举之后,如果'_UNICODE'是的#define倒是。 –

+0

我假设第三方库中的代码不能被修改。无论如何,你的建议应该肯定有帮助。 –

+0

你可以随意修改一个库的.h文件,因为你的代码必须编译它们。 –

0

撇开效率,这是c/C++枚举的真正缺点。

每当我面对的问题是这样,我尝试以下2项决议:

  1. 添加命名空间来保护他们。

  2. 添加的枚举名称的前缀:ENCODING_UNICODE

+0

我同意你的意见。我认为,无论何时声明类,结构,枚举等,我们都必须使用命名空间来解决这个问题,以及格式良好的代码。 – hyun

+0

如果人们停止命名所有首都中不是预处理器宏的东西,那么问题就不大了。 – jamesdlin

+1

命名空间不能解决这个问题,因为'UNICODE'是一个预编译器定义,因此不受名称空间的影响。如果未使用'#undef'语句,则需要在枚举上使用前缀。 –