當這兩個頭文件順序顛倒時,編譯會出現許多莫名其妙的錯誤,錯誤如下:
1>…\include\ws2def.h(91) : warning C4005: 'AF_IPX' : macro redefinition
1>…\include\winsock.h(460) : see previous definition of 'AF_IPX'
…
[原因分析]
主要原因是因為<Windows.h>中包含了<Winsock.h>頭文件,由於其版本的不同,導致出現上述的錯誤。<Windows.h>中相關代碼如下:
#ifndef WIN32_LEAN_AND_MEAN
#include <cderr.h>
#include <dde.h>
#include <ddeml.h>
........
#ifndef _MAC
#include <winperf.h>
#include <winsock.h>
#endif
.......
#include <commdlg.h>
#endif
#endif
[解決方案]
由以上代碼可以看出如果在沒有定義WIN32_LEAN_AND_MEAN宏的大前提下Windows.h有可能包含Winsock.h 頭文件,而我們要用的頭文件為 <Winsock2.h>,那么Windows.h中的<Winsock.h>和我們需要的不是一個版本,所以會有以上的錯誤。
[如何解決]
很簡單,在當前工程(就是編譯不過的這個工程)所有include語句最前面加上#include <Winsock2.h>這樣就避免了重復定義頭文件的錯誤。