C ++重新定义头文件(winsock2.h)

如何防止两次包含头文件?问题是我包括在MyClass.h中,然后在许多文件中包含MyClass.h,因此它包含多次,并且发生重定义错误。怎么预防?


我使用#pragma一次而不是使用包括卫兵,我想那很好。


MyClass.h:


// MyClass.h

#pragma once


#include <winsock2.h>


class MyClass

{


// methods

public:

 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-int

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-int

翻翻过去那场雪
浏览 1277回答 3
3回答

一只名叫tom的猫

当包含<windows.h>before 时,会导致此问题<winsock2.h>。尝试排列<windows.h>包含在其后的包含列表,<winsock2.h>或_WINSOCKAPI_首先定义:#define _WINSOCKAPI_&nbsp; &nbsp; // stops windows.h including winsock.h#include <windows.h>// ...#include "MyClass.h"&nbsp; &nbsp; // Which includes <winsock2.h>

皈依舞

正如其他人所建议的那样,问题是在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就足够了(在大多数情况下是)。这可能会导致更长的编译时间,但可以解决所有错误/警告。

明月笑刀无情

通过使用“标题保护”:#ifndef MYCLASS_H#define MYCLASS_H// This is unnecessary, see comments.//#pragma once// MyClass.h#include <winsock2.h>class MyClass{// methodspublic:&nbsp; &nbsp; MyClass(unsigned short port);&nbsp; &nbsp; virtual ~MyClass(void);};#endif
打开App,查看更多内容
随时随地看视频慕课网APP