windows.h winsock2.h winsock.h的关系

  windows.h winsock2.h winsock.h的关系

前两天编译openssl工程
遇到如下错误
--------------------Configuration: ssleay32 - Win32 Debug--------------------
Compiling...
ssl_algs.c
D:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/mswsock.h(69) : error C2146: syntax error : missing ')' before identifier 's'
D:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/mswsock.h(69) : error C2061: syntax error : identifier 's'
D:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/mswsock.h(69) : error C2059: syntax error : ';'
......

查看为

SOCKET未定义。

通过加#error 指令二分查找,找到了如下头文件的包含关系
file: e_os.h

而<winsock2.h>文件开始还没有任何实质性定义(如SOCKET)之前又如下代码

如果_WIN32_WINNT被定义且值大于等于0x0400的时候将有最开始的winsock2.h 包了windows.h windows.h包了winsock2.h和mswsock.h,但后者包winsock2.h的时候因为防止头文件重复包含的缘故并没有再去 引入实质内容。如此一来随后包含mswsock.h时该文件内用到的SOCKET符号将出现未定义的编译错误。

寻这段代码上下看会看到:


MSDN上对WIN32_LEAN_AND_MEAN有如下解释:
Faster Builds with Smaller Header Files
You can reduce the size of the Windows header files by excluding some of the less common API declarations as follows:

Define WIN32_LEAN_AND_MEAN to exclude APIs such as Cryptography, DDE, RPC, Shell, and Windows Sockets.
Define one or more of the NOapi symbols to exclude the API. For example, NOCOMM excludes the serial communication API. For a list of support NOapi symbols, see Windows.h.

 

意思是说你可以通过排除很少使用的API声明文件降低windows头文件的大小。定义WIN32_LEAN_AND_MEAN以排除涉及Cryptography,DDE,RPC,Shell和SOCKET。

 

现在我们自己明确include我们需要的头文件,没必要由windows.h代劳,因而可定义该宏进行exclude。

 

如此一来,很和谐的编译完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值