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

fquxozlt  于 2023-10-16  发布在  Windows
关注(0)|答案(4)|浏览(118)

我有一个问题,包括两个文件。现在,我知道我需要首先包含Winsock 2,然后是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包含在header 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,尽管它仍然会为我带来错误。

6ljaweal

6ljaweal1#

确保<windows.h>不包含<winsock.h>(它提供了许多与<winsock2.h>相同的声明)。在我的系统上的<winsock2.h>文件中,有这样一行:

#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */

**_WINSOCKAPI_**include guard可能是一个内部实现细节,但作为一个实际的解决方案,我会依赖它,只是在包含<windows.h>之前定义这个符号,例如。在编译器调用中(对于IDE,这意味着在IDE项目设置中)。

或者,你可以尝试always include <winsock2.h> before <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
{}
332nm8kg

332nm8kg2#

我确保#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”`作为第一个include。

ac1kyiln

ac1kyiln3#

将includes添加到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")
jgzswidk

jgzswidk4#

该键在编译前定义WIN32_LEAN_AND_MEAN
你需要设置它,并重新检查包含。
因为没有设置它,MFC框架将抛出一条消息“#error WINDOWS. H already included.”。MFC应用程序不能#include<Windows.h>“

相关问题