我有一个问题,包括两个文件。现在,我知道我需要首先包含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
,尽管它仍然会为我带来错误。
4条答案
按热度按时间6ljaweal1#
确保
<windows.h>
不包含<winsock.h>
(它提供了许多与<winsock2.h>
相同的声明)。在我的系统上的<winsock2.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
优化来获得 * 正确性 *。即,最小值:
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。
ac1kyiln3#
将includes添加到pch.h:
jgzswidk4#
该键在编译前定义WIN32_LEAN_AND_MEAN
你需要设置它,并重新检查包含。
因为没有设置它,MFC框架将抛出一条消息“#error WINDOWS. H already included.”。MFC应用程序不能#include<Windows.h>“