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。
如此一来,很和谐的编译完成。