不能包含这两个文件(WinSock2,Windows.h)
我遇到包括这两个文件的问题。 现在,我知道我需要或者包括的Winsock2,然后再WINDOWS.H,或简单地说:不能包含这两个文件(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
,我包括头Client.h
XS.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项目设置中)。
另外,你也可以尝试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
优化正确性。
I.e.,最低:
#undef UNICODE
#define UNICODE
#undef _WINSOCKAPI_
#define _WINSOCKAPI_
#include <windows.h>
#include <winsock2.h>
auto main()
-> int
{}
事实证明,我包括windows.h在我的主要源文件,这导致了问题,然后'WINSOCKAPI'修复其他erros ... 谢谢! – Amit
我确信,一个#include "Winsock2.h"
是之前任何#include "windows.h"
和"#include "Winsock.h"
,这解决了问题。
耐心早晚的事情,看看包括一个接一个,建立这个顺序,先#include "Winsock2.h"
然后#include "windows.h"
我查了递归包括,我看准了头文件,其中包括(递归)一些的#include“窗口.h“和”#include“Winsock.h”并写入#include“Winsock2.h”。在这个文件中,我添加了#include“Winsock2.h”`作为第一个包含。
使用'#pragma once '在头文件 –
我建议总是首先包含windows.h和windowsx.h,在每个源文件中(最好使用stdafx.h文件)。我不确定它是否解决了这个问题,但它减少了很多混淆。 – PMF
我已经改变了'Client.h'包括这样: '#PRAGMA一次 的#include 的#include 的#include “Chat.h”' 虽然它仍然不工作,同样的错误。 ... –
Amit