【BUG】VS2012的智能感知器为什么有时候会有奇怪的报错
前几天在编写一个DirectX游戏的时候遇到的问题:VS2012的IDE总是把lpVtbl这个东西打上下划线,说“IDirect3D9没有成员lpVtbl”。但是编译运行却没有出错。之所以会用到lpVtbl是因为我用的是C语言。在C语言的眼里,一个COM类就是这样一个结构体:typedef struct COM类名;
typedef struct
{
各种COM类成员函数的指针(第一个参数是COM类名*pThis);
}COM类名Vtbl;
typedef struct
{
COM类名Vtbl*lpVtbl;
}COM类名,*LPCOM类名;其中你需要调用COM类的成员函数,C++这么写:COM类指针->函数名(参数);而用C语言则这么写:COM类指针->lpVtbl->函数名(COM类指针,参数);这样写的话,能正常编译运行,但是在VS2012编辑的时候,它的智能感知(Intellisense)会报错,说“COM类没有成员lpVtbl”。这是怎么回事呢?
我第一个想到的就是,这个Intellisense可能把.h后缀的文件认定为“C++源代码”,所以在.h文件里,“__cplusplus”默认是定义了的(不是被编译器定义了,而是被Intellisense定义了)而这个.h文件是被.c文件包含的(C语言),因此本来__cplusplus是不应该被定义的。
为了验证我的这种设想,我这样尝试:
在一个头文件定义一些东西,然后加上这样的语句:#ifdef __cplusplus
Fuck
#endif然后用C语言文件包含这个头文件,并且引用这个头文件里面定义的东西。结果发现C语言文件能正常编译运行,而Intellisense则不断报错:“Fuck此声明没有存储类或类型说明符、未定义的标识符、声明与XXX的声明不兼容”之类的错误。
有图为证:
那么看来这个VS2012的Intellisense的BUG是因为其对.h文件和预定义错误的处理导致的。
不过,对于COM编程,我有个办法使其不报错!
那就是——在你的.c文件第一句加上这个代码:#define CINTERFACE /*我讨厌VS2012的Intellisense把.H当作C艹文件来处理!*/哟西,搞定! 自己顶上去。看来COM的公共头文件考虑得真是全面。
页:
[1]