不能包含这两个文件(WinSock2、Windows.h)

问题描述 投票:0回答:4

我在包含这两个文件时遇到问题。 现在,我知道我需要首先包含 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
,尽管它仍然对我造成错误。

c sockets winapi winsock2
4个回答
22
投票

确保

<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 {}
    

5
投票
我确保

#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"` 作为第一个包含。


1
投票
将包含添加到 pch.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")
    

0
投票
关键是设置预编译定义 WIN32_LEAN_AND_MEAN

您需要设置它,并重新检查包含。

因为没有设置它,MFC框架将抛出一条消息“#error WINDOWS.H已经包含。MFC应用程序不得#include

© www.soinside.com 2019 - 2024. All rights reserved.