VS winsock.h和ws2def.h大量重定義報錯的問題


 

 

 

報錯原因:

  我們知道,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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM