笔者最近作开发,适用MSVC 6.0作为开发工具。刚开始核心算法部分采用console形式,没出现什么问题。
后来决定将核心部分封装到win32 DLL,可是这个时候问题就出现了。编译器总是提示一个enum类型定义
有问题,由于涉及到N多的头文件,搞的焦头烂额,因为同样的头文件放在console形式的工程下面就没有
问题。
后来偶然发现,只要将enum里面定义的几个项的名字改一下就没有问题了,出问题的几个项是IN、
OUT、PURE。为什么会出这个问题呢,后来才搞清楚,console仅仅是调用了常用的IO库,而win32 DLL需要
调用windows.h头文件,后者又包含了大量的windows头文件,而这些头文件里已经将IN、OUT等关键字用上
了,这就是问题所在,但是VC的编译器提示却晦涩不明,让人看不懂到底出了什么问题,实在让人气愤。
为了说明问题,做了一个小例子,如下:
#include <windows.h>
#include <iostream>
using namespace std;
enum myenum
{
AAA=1,
BBB=2,
CCC=3,
IN=4,
OUT=5,
PURE=6
};
int main()
{
for(int i=0; i<10; i++)
{
cout<<i<<endl;
}
myenum my1;
my1=OUT;
return 1;
}
VC 6.0输出如下编译错误信息,VC7.1的输出信息类似,也强不到哪里去,各位看看是不是很晦涩:
D:/testKEY/testKEY.cpp(11) : error C2059: syntax error : '='
D:/testKEY/testKEY.cpp(14) : error C2143: syntax error : missing ';' before '}'
D:/testKEY/testKEY.cpp(14) : error C2143: syntax error : missing ';' before '}'
D:/testKEY/testKEY.cpp(23) : error C2059: syntax error : ';'
相比较而言,mingw提示的稍微明确一点,说没有合格的标识符,至少指明了努力的方向:
testKEY.cpp:11: error: expected identifier before '=' token
testKEY.cpp:11: error: expected `}' before '=' token
testKEY.cpp:11: error: expected unqualified-id before '=' token
testKEY.cpp:11: error: expected `,' or `;' before '=' token
testKEY.cpp:14: error: expected declaration before '}' token
解决方法很简单,把IN、OUT、PURE改一下,比如__IN__、__OUT__、__PURE__;或者去掉对windows.h的引用。鉴于这个问题困扰了我一天,鄙视微软一下,也望大家引以为戒,千万不要定义过于soso的标识符,免得冲突。