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

时间:2014-01-28 07:45:02

标签: c sockets winapi winsock2

我遇到了包含这两个文件的问题。 现在,我知道我需要首先包含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.hClient.h包含如下所示:

#ifndef CLIENT_H
#define CLIENT_H

#include "XS.h"

XS.hClient.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,但它仍然为我做错误。

3 个答案:

答案 0 :(得分:15)

确保<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>,{{1} }},<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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

将包含添加到 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")