最近發現winsock2.h頭文件與windows.h頭文件在同時包含的時候會有問題,編譯時會產生很多類型重複定義的錯誤。
[原因分析]
主要原因是因爲<windows.h>中包含了<winsock.h>頭文件,由於其版本的不同(winsock.h支持socket 1.1),導致出現上述的錯誤。
<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
[解決方案]
方案(1) 首先包含winsock2.h,然後再包括 windows.h,要注意包含的順序。
在Windows.h中,包含了winsock.h(winsock.h支持socket 1.1)。因此首先包含windows.h,然後再包含winsock2.h,顯然會出現問題。
方案(2) 由以上代碼可以看出如果在沒有定義WIN32_LEAN_AND_MEAN宏的大前
下windows.h有可能包含winsock.h 頭文件,因此我們得出一個很簡單
的解決方法就是在包含<windows.h>之前定義WIN32_LEAN_AND_MEAN宏,如
下所示:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>