包括 stdafx.h winsock2 重新定义错误

Posted

技术标签:

【中文标题】包括 stdafx.h winsock2 重新定义错误【英文标题】:Includes stdafx.h winsock2 redefinition errors 【发布时间】:2010-01-01 15:37:22 【问题描述】:

当我包含 winsock2.h 时,我收到大约 60 个重新定义错误。我四处搜寻了一下,发现了一些建议,包括 windows.h 在内的 winsock2.h b4。我这样做了,这清除了错误。我的问题和疑问正是我应该如何去做。我没有明确包含 windows.h,它是在 stdafx.h 或 stdafx.cpp 中为我完成的。

我立即在 stdafx.h 中添加了包含 winsock2.h 的 b4 包含 Windows.h。这是解决此问题的正确方法还是有更好的方法?

根据 program_name.rc 中的注释判断,我收集到 stdafx.h 中包含的 windows.h 可能由于某些选项或配置参数而被放置在那里,但我无法找到此参考。有什么方法可以指定 stdafx.h 中包含哪些文件?

顺便说一句,WIN32_LEAN_AND_MEAN 是在 stdafx.h 中调用 windows.h 定义的。

我正在使用 Visual c++ 6.0 和“Windows Server 2003 PSDK”程序是直接的 c++,没有 mfc,没有网络,只是普通的香草。

【问题讨论】:

【参考方案1】:

您可以将几乎任何您想要的内容放入 stdafx.h。在 windows.h 之前添加你的#include for winsock2.h 当然没问题。我会移动 WIN32_LEAN_AND_MEAN 标头,以便在包含任何其他标头之前对其进行定义:

#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <windows.h>

stdafx.h 是预编译头文件的可怕名称。我不知道为什么 Visual Studio 仍然将它用于所有自动生成的项目。它给预编译的头文件带来了一种不应有的神秘感。在我的项目中,我通常将预编译头文件设置为使用“precompiled.h”和“precompiled.cpp”。

Noel Llopis 有一篇关于预编译头的精彩文章 - 'The Care and Feeding of Precompiled Headers' 如果您想了解更多关于这里发生的事情的背景信息。

【讨论】:

【参考方案2】:

应该没问题。如果您查看 winsock2.h,您可以看到它包含 windows.h(如果尚未包含)。

【讨论】:

从 stdafx.h 和 stdafx.cpp 中的 cmets 判断,用户打算在 stdafx.h 中添加额外的包含。我对 stdafx.cpp 中的注释有点好奇 // stdafx.cpp :仅包含标准的源文件包含 // Solar.pch 将是预编译的头文件 // stdafx.obj 将包含预编译的类型信息 “类型”信息是什么意思?谁能举个例子? 通过向 stdafx.h 添加包含,我认为预编译的标头在空间方面更有效。但是我知道如果您在项目设置中打开该选项,则预编译的标头可以在没有 stdafx.* 的情况下工作。至少 Visual Studio 总是为我的所有项目创建一个 .pch,即使我没有 stdafx.* 的东西。其他人可能有更多关于“类型”信息的信息。不过,我认为它仍然只是它与 .pch 文件一起用于构建的信息的一部分。【参考方案3】:

您需要确保 WinSock2.h 包含在 windows.h 之前,确保无论您在何处包含 WinSock2.h,它都包含在 stdafx.h 和/或 windows.h 之前

【讨论】:

以上是关于包括 stdafx.h winsock2 重新定义错误的主要内容,如果未能解决你的问题,请参考以下文章

WinSock2.h 中的重新定义错误 [重复]

C/S模型之TCP协议

客户端长连接断线重连机制

基于UDP的IP对IP的客户端程序

WIN32_LEAN_AND_MEAN 含义以及用法

C/S模型之UDP协议