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 关注
- 1276 浏览
添加回答
举报