報錯原因:
我們知道,Windows網絡編程至少需要兩個頭文件:winsock2.h和windows.h,而在WinSock2.0之前還存在一個老版本的winsock.h。正是這三個頭文件的包含順序,導致了上述問題的出現。
winsock2.h的內容,在文件開頭有如下宏定義:
#ifndef _WINSOCK2API_ #define _WINSOCK2API_ #define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */ ...... 中間已省略 ...... /* * Pull in WINDOWS.H if necessary */ #ifndef _INC_WINDOWS #include <windows.h> #endif /* _INC_WINDOWS */
這是最常見的防止頭文件重復包含的保護措施。
_WINSOCKAPI_的定義阻止了對老文件winsock.h的包含
即是說,如果用戶先包含了winsock2.h就不允許再包含winsock.h了,
后半段作用是:如果用戶沒有包含windows.h(_INC_WINDOWS在windows.h中定義)就自動包含它,以定義WinSock2.0所需的類型和常量等。
現在切換到windows.h,我們會的發現以下內容:(注:這里是MS的Platform SDK中的windows.h與VC自帶的文件存在差異)
#ifndef _MAC #include <winperf.h> #include <winsock.h> #endif
其實很容易理解,文件間相互包含,而的定義順序導致了winsock在winsock2之前被包含,就會導致大量重復定義的錯誤。
解決:
找到代碼中包含windows.h和winsock2.h的地方,讓winsock2在windows之前被包含就行了
(或者專門寫個頭文件,用於解決這個問題)
在stdafx.h中加入:
#include <WinSock2.h> #include <windows.h>
就可以解決了。
如果發現解決方案里並未發現包含這兩個文件,可以那么很有可能是使用的開發包或者其他文件中使用了內容。
(參考博客:https://blog.csdn.net/weixin_43956221/article/details/117217614)