为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 1276 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信