不能包含这两个文件(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.hXS.hClient.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,但它仍然没有错误我。

+0

使用'#pragma once '在头文件 –

+0

我建议总是首先包含windows.h和windowsx.h,在每个源文件中(最好使用stdafx.h文件)。我不确定它是否解决了这个问题,但它减少了很多混淆。 – PMF

+0

我已经改变了'Client.h'包括这样: '#PRAGMA一次 的#include 的#include 的#include “Chat.h”' 虽然它仍然不工作,同样的错误。 ... – Amit

确保<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 
{} 
+0

事实证明,我包括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”`作为第一个包含。