【发布时间】:2014-02-19 09:37:03
【问题描述】:
我在包含这两个文件时遇到了问题。 现在,我知道我需要先包含 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.h 中。
Client.h include 看起来像这样:
#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,尽管它仍然对我有错误。
【问题讨论】:
-
在头文件中使用
#pragma once -
我建议总是首先在每个源文件中包含 windows.h 和 windowsx.h(最好使用 stdafx.h 文件)。我不确定它是否能解决这个特殊问题,但它可以大大减少混乱。
-
我已将
Client.h更改为:#pragma once #include <winsock2.h> #include <ws2tcpip.h> #include "Chat.h"虽然它仍然不起作用,同样的错误...... -
微软的“智能感知”不使用与编译器相同的分析引擎,因此它可以并且确实为完全有效的代码吐出“错误消息”。也就是说,这听起来是一个真正的问题,而不仅仅是一个 Intellisense 明显的问题。在包含任何其他 Windows API 标头之前,您应该始终包含
windows.h。这是因为 Microsoft 标头通常不包含他们需要的所有内容,即不遵循良好的编程习惯。可以只将<windows.>强制包含,但这会重复导致问题的弊端:更好地修复源代码。