3 回答
TA貢獻1906條經驗 獲得超3個贊
當包含<windows.h>before 時,會導致此問題<winsock2.h>。嘗試排列<windows.h>包含在其后的包含列表,<winsock2.h>或_WINSOCKAPI_首先定義:
#define _WINSOCKAPI_ // stops windows.h including winsock.h
#include <windows.h>
// ...
#include "MyClass.h" // Which includes <winsock2.h>
TA貢獻1851條經驗 獲得超3個贊
正如其他人所建議的那樣,問題是在windows.h之前包含了WinSock2.h。因為windows.h包含winsock.h。您不能同時使用WinSock2.h和winsock.h。
解決方案:
WinSock2.h在之前包括windows.h。如果是預編譯頭文件,則應在此處解決。在簡單項目的情況下,這很容易。但是,在大型項目中(尤其是在編寫可移植代碼而沒有預編譯的標頭的情況下),這可能會非常困難,因為當WinSock2.h包含標頭時,windows.h可以從其他標頭/實現文件中包含標頭。定義
WIN32_LEAN_AND_MEAN之前windows.h或項目范圍。但是它將排除您可能需要的許多其他內容,因此您應該自己添加。定義
_WINSOCKAPI_之前windows.h或項目范圍。但是當您包含WinSock2.h它時,您會收到宏重新定義警告。對于您的項目來說,使用
windows.h而不是WinSock2.h什么時候winsock.h就足夠了(在大多數情況下是)。這可能會導致更長的編譯時間,但可以解決所有錯誤/警告。
TA貢獻1828條經驗 獲得超4個贊
通過使用“標題保護”:
#ifndef MYCLASS_H
#define MYCLASS_H
// This is unnecessary, see comments.
//#pragma once
// MyClass.h
#include <winsock2.h>
class MyClass
{
// methods
public:
MyClass(unsigned short port);
virtual ~MyClass(void);
};
#endif
- 3 回答
- 0 關注
- 1379 瀏覽
添加回答
舉報
