我在包含这两个文件时遇到问题。 现在,我知道我需要首先包含 Winsock2,然后包含 windows.h,或者简单地说:
#define WIN32_LEAN_AND_MEAN
但是,我仍然遇到问题
我有一个名为
XS.h
的头文件,看起来像这样
#ifndef XS_H
#define XS_H
#include <winsock2.h>
#include <ws2tcpip.h>
#include <Windows.h>
#endif
并且我将
XS.h
包含在标题 Client.h
中。
Client.h
包含看起来像这样:
#ifndef CLIENT_H
#define CLIENT_H
#include "XS.h"
XS.h
是我唯一包含在 Client.h
中的内容,但我仍然收到错误(如您所见,Winsock
包含在 windows.h
之前)
我收到大约 78 个错误,以下是其中一些:
Error 90 error C3861: 'WSASetLastError': identifier not found c:\program files (x86)\windows kits\8.0\include\um\ws2tcpip.h 703
Error 61 error C2375: 'WSAStartup' : redefinition; different linkage c:\program files (x86)\windows kits\8.0\include\um\winsock2.h 2296
Error 49 error C2375: 'send' : redefinition; different linkage c:\program files (x86)\windows kits\8.0\include\um\winsock2.h 2026
如何解决这个问题?
谢谢!
编辑:我也尝试过使用
#define _WINSOCKAPI_
,尽管它没有解决我的问题......
我先有 winsock.h
,然后是 windows.h
,尽管它仍然对我造成错误。
确保
<windows.h>
不包含 <winsock.h>
(它提供了许多与 <winsock2.h>
相同的声明)。在我系统上的 <winsock2.h>
文件中有这一行:
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */
_WINSOCKAPI_
包含保护可能是一个内部实现细节,但作为一个实用的解决方案,我会依赖它,只需在包含<windows.h>
之前定义这个符号,例如在编译器调用中(对于 IDE 来说意味着在 IDE 项目设置中)。
或者,您可以尝试在 <winsock2.h>
<windows.h>
,以便建立相关的包含防护(无论它是什么)(但我认为这比仅仅假设上述防护实际上定义良好要脆弱得多);
或者您可以定义 WIN32_LEAN_AND_MEAN
,这会阻止
<windows.h>
包含
<winsock.h>
以及其他一些标头(从我系统上的源代码列出,这些标头是
<cderr.h>
、
<dde.h>
、
<ddeml.h>
、
<dlgs.h>
、)
<lzexpand.h>
、
<mmsystem.h>
、
<nb30.h>
、
<rpc.h>
、
<shellapi.h>
、
<winperf.h>
、
<wincrypt.h>
、
<winefs.h>
、
<winscard.h>
、
<winspool.h>
、
<ole2.h>
,以及
<commdlg.h>
)。我不建议依靠
WIN32_LEAN_AND_MEAN
优化来实现正确性。 即,最小值:
#undef UNICODE
#define UNICODE
#undef _WINSOCKAPI_
#define _WINSOCKAPI_
#include <windows.h>
#include <winsock2.h>
auto main()
-> int
{}
#include "Winsock2.h"
位于任何
#include "windows.h"
和
"#include "Winsock.h"
之前,这解决了这个问题。只需要有耐心,逐一查看包含内容并建立此顺序,先
#include "Winsock2.h"
,然后
#include "windows.h"
我检查了递归包含,我发现头文件包含(递归)一些#include“windows.h”和“#include“Winsock.h”并写入#include“Winsock2.h”。在这个文件中,我添加#include "Winsock2.h"` 作为第一个包含。
// TODO: add headers that you want to pre-compile here
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
您需要设置它,并重新检查包含。
因为没有设置它,MFC框架将抛出一条消息“#error WINDOWS.H已经包含。MFC应用程序不得#include
”