找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3520|回复: 1

【BUG】VS2012的智能感知器为什么有时候会有奇怪的报错

[复制链接]

1109

主题

1649

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24180 个
贡献
46222 次
宅之契约
0 份
在线时间
2294 小时
注册时间
2014-1-26
发表于 2014-8-19 03:28:36 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
前几天在编写一个DirectX游戏的时候遇到的问题:VS2012的IDE总是把lpVtbl这个东西打上下划线,说“IDirect3D9没有成员lpVtbl”。但是编译运行却没有出错。
之所以会用到lpVtbl是因为我用的是C语言。在C语言的眼里,一个COM类就是这样一个结构体:
  1. typedef struct COM类名;

  2. typedef struct
  3. {
  4.     各种COM类成员函数的指针(第一个参数是COM类名*pThis);
  5. }COM类名Vtbl;

  6. typedef struct
  7. {
  8.     COM类名Vtbl*lpVtbl;
  9. }COM类名,*LPCOM类名;
复制代码
其中你需要调用COM类的成员函数,C++这么写:
  1. COM类指针->函数名(参数);
复制代码
而用C语言则这么写:
  1. COM类指针->lpVtbl->函数名(COM类指针,参数);
复制代码
这样写的话,能正常编译运行,但是在VS2012编辑的时候,它的智能感知(Intellisense)会报错,说“COM类没有成员lpVtbl”。这是怎么回事呢?

我第一个想到的就是,这个Intellisense可能把.h后缀的文件认定为“C++源代码”,所以在.h文件里,“__cplusplus”默认是定义了的(不是被编译器定义了,而是被Intellisense定义了)而这个.h文件是被.c文件包含的(C语言),因此本来__cplusplus是不应该被定义的。

为了验证我的这种设想,我这样尝试:
在一个头文件定义一些东西,然后加上这样的语句:
  1. #ifdef __cplusplus
  2. Fuck
  3. #endif
复制代码
然后用C语言文件包含这个头文件,并且引用这个头文件里面定义的东西。结果发现C语言文件能正常编译运行,而Intellisense则不断报错:“Fuck此声明没有存储类或类型说明符、未定义的标识符、声明与XXX的声明不兼容”之类的错误。
有图为证:
Fuck.png
Fuck2.png
Fuck3.png

那么看来这个VS2012的Intellisense的BUG是因为其对.h文件和预定义错误的处理导致的。
不过,对于COM编程,我有个办法使其不报错!
那就是——在你的.c文件第一句加上这个代码:
  1. #define CINTERFACE /*我讨厌VS2012的Intellisense把.H当作C艹文件来处理!*/
复制代码
哟西,搞定!
回复

使用道具 举报

1109

主题

1649

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24180 个
贡献
46222 次
宅之契约
0 份
在线时间
2294 小时
注册时间
2014-1-26
 楼主| 发表于 2014-8-22 21:20:03 | 显示全部楼层
自己顶上去。看来COM的公共头文件考虑得真是全面。
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-3-29 21:05 , Processed in 0.044860 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表