Ami*_*mit 13 c sockets winapi winsock2
我遇到了包括这两个文件的问题.现在,我知道我需要首先包含Winsock2,然后是windows.h,或者简单地说:
#define WIN32_LEAN_AND_MEAN
Run Code Online (Sandbox Code Playgroud)
但是,我还有问题
我有一个调用的头文件,XS.h看起来像这样
#ifndef XS_H
#define XS_H
#include <winsock2.h>
#include <ws2tcpip.h>
#include <Windows.h>
#endif
Run Code Online (Sandbox Code Playgroud)
我XS.h在标题中包括在内Client.h.
Client.hinclude看起来像这样:
#ifndef CLIENT_H
#define CLIENT_H
#include "XS.h"
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
谢谢!
编辑:我也尝试使用#define _WINSOCKAPI_,虽然它没有解决我的问题...我winsock.h先有,然后windows.h,虽然它仍然为我做错.
Che*_*Alf 18
确保<windows.h>不包含<winsock.h>(提供许多相同的声明<winsock2.h>).在<winsock2.h>我的系统上的文件中有这一行:
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */
Run Code Online (Sandbox Code Playgroud)
该_WINSOCKAPI_包括后卫可能是一个内部实现细节,但作为一个实际的解决方案,我将依靠它,包括之前刚刚定义这个符号<windows.h>,例如在编译器调用(其中一个IDE在IDE项目设置手段).
或者,您可以尝试始终包括<winsock2.h>之前<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
{}
Run Code Online (Sandbox Code Playgroud)
我确信,一个#include "Winsock2.h"是之前的任何#include "windows.h"和"#include "Winsock.h"这解决了问题。
耐心一点,一一查看include并建立这个顺序,先 #include "Winsock2.h"然后#include "windows.h"
我检查了递归包含,我发现了头文件,其中包含(递归地)一些 #include "windows.h" 和 "#include "Winsock.h" 并写了一个#include "Winsock2.h"。在这个文件中,我添加了#include "Winsock2.h"` 作为第一个包含。