亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++重新定義頭文件(winsock2.h)

C ++重新定義頭文件(winsock2.h)

C++
翻翻過去那場雪 2019-10-06 14:44:27
如何防止兩次包含頭文件?問題是我包括在MyClass.h中,然后在許多文件中包含MyClass.h,因此它包含多次,并且發生重定義錯誤。怎么預防?我使用#pragma一次而不是使用包括衛兵,我想那很好。MyClass.h:// MyClass.h#pragma once#include <winsock2.h>class MyClass{// methodspublic: MyClass(unsigned short port); virtual ~MyClass(void);};編輯:我得到的錯誤很少c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(91) : warning C4005: 'AF_IPX' : macro redefinition        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(460) : see previous definition of 'AF_IPX'c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(124) : warning C4005: 'AF_MAX' : macro redefinition        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(479) : see previous definition of 'AF_MAX'c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(163) : warning C4005: 'SO_DONTLINGER' : macro redefinition        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(402) : see previous definition of 'SO_DONTLINGER'c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(206) : error C2011: 'sockaddr' : 'struct' type redefinition        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(485) : see declaration of 'sockaddr'c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: syntax error : missing '}' before 'constant'c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: syntax error : missing ';' before 'constant'c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2059: syntax error : 'constant'c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C2143: syntax error : missing ';' before '}'c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-intc:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
查看完整描述

3 回答

?
一只名叫tom的貓

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>


查看完整回答
反對 回復 2019-10-06
?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

正如其他人所建議的那樣,問題是在windows.h之前包含了WinSock2.h。因為windows.h包含winsock.h。您不能同時使用WinSock2.hwinsock.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就足夠了(在大多數情況下是)。這可能會導致更長的編譯時間,但可以解決所有錯誤/警告。


查看完整回答
反對 回復 2019-10-06
?
明月笑刀無情

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


查看完整回答
反對 回復 2019-10-06
  • 3 回答
  • 0 關注
  • 1379 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號