邪恶的Windows

邪恶的Windows

众所周知,WIN32 API分为Unicode版和非Unicode版,由于Unicode是后来加进来的,为了向下兼容,微软的兄弟们使用了宏来统一接口,如MessageBox的定义:
#ifdef UNICODE
#define  MessageBox  MessageBoxW
#else
#define  MessageBox  MessageBoxA
#endif   //  !UNICODE
这个方法并不像看上去的那么完美,请看下面这段无辜的代码:
class  MyClass
{
 
public:
    
void MessageBox();
 
}
;
当项目中包含windows.h,更确切点说是winuser.h,如果未使用Unicode,在预编辑阶段,MyClass::MessageBox会被替换成MyClass::MessageBoxA,而后让人摸不着头脑的编译错误便跳了出来。据笔者经验,与这些API同名的几率其实很少,但正是因为少,当出现此种编译错误时却让人不知如何是好。一种简单的解决方法便是在MyClass头文件中undef掉MessageBox:
#ifdef MessageBox
#undef  MessageBox
#endif

你可能感兴趣的:(邪恶的Windows)