现在的位置: 首页 > 综合 > 正文

vs2008 编译选项showIncludes 应用一例

2013年07月26日 ⁄ 综合 ⁄ 共 1230字 ⁄ 字号 评论关闭

开门见山,直接上错误信息——
1>d:\test\s_host.h(20) : error C2143: 语法错误 : 缺少“;”(在“.”的前面)
1>d:\test\s_host.h(20) : error C2059: 语法错误 : “.”
1>d:\test\s_host.h(20) : error C2059: 语法错误 : “public”
1>d:\test\s_host.h(21) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>d:\test\s_host.h(21) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)

而第20行只是声明一个名为s_host的类,第21行只有一个左花括号而已。如下所示: 

class s_host : public CDialog       //line20
{                                   //line21
    //......
};

查了一下,才知s_host原来在inaddr.h与Winsock2.h中已经被define定义,而这里我又重新定义s_host为类,所以会出一堆莫名的错。若那两个文件不是define而是一般的类或是变量定义的话,则会直接报标识符重复定义吧。接下来有两条路可以选择,一是直接修改我定义的类名;二是想办法让我的编译器不要包含inaddr.h与Winsock2.h(前提是项目中并没有使用这两个头文件)。

如上一看似是最简单直接的方法,我也尝试了,确是OK;下方接着讨论二的具体做法。

首先,我的项目中并没有显式包含inaddr.h与Winsock2.h,原来啊,mfc应用中大多会包含的afxwni.h中包含了这两个头文件。

修改如上选项(showIncludes)为Yes后,编译时就会输出如下类似的信息,而且用缩进来指示嵌套包含文件,每个嵌套级别使用一个空格。

Note: including file: d:\temp\1.h

Note: including file:  d:\temp\2.h

通过如上的办法,查明了winsock2.h和inaddr.h在afxwin.h是通过_WINSOCK2API_,_WS2IPDEF_,__IPHLPAPI_H__来控制是否包含的(#ifndef)。

#ifndef _WINSOCK2API_
#ifdef _WINSOCKAPI_
	#error MFC requires use of Winsock2.h
#endif
	#include <winsock2.h>
#endif


#ifndef _WS2IPDEF_
	#include <ws2ipdef.h>
#endif


#ifndef __IPHLPAPI_H__
	#include <iphlpapi.h>
#endif

下面就只要在编译选项(预处理器定义)中加入这三个define,就可以阻止winsock2.h和inaddr.h的包含。如下图:

【参考】:http://sun3eyes.blog.163.com/blog/static/1070797922012872528166/(博主:太阳三只

【上篇】
【下篇】

抱歉!评论已关闭.