vs2008 编译选项showIncludes 应用一例

来源:互联网 发布:网络药品销售 编辑:程序博客网 时间:2024/05/17 16:42
开门见山,直接上错误信息——
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/(博主:太阳三只)

原创粉丝点击