1

为了避免与 winsock2.h 冲突,我想用 WIN32_LEAN_AND_MEAN 包装我的 windows.h 包含(我在 windows.h 之后取消定义它,以免干扰包含我的标头的应用程序)。当 winsock2.h 不包括在内时,这样做会导致 timeval 未定义。包括 time.h 也没有定义 timeval。

如何获得定义的 timeval (a) 无需包含 winsock2.h,(b) 不要求包含我的标头的应用程序在我的标头之前包含 winsock2.h,(c) 允许应用程序在需要时包含 winsock2.h ,并且 (d) 不必自己定义 timeval,因为它可能已经由父应用程序包含的标头定义?

4

4 回答 4

1

这就是我处理问题的方式winsock2.h(假设是 Visual C++):

  • 我将构建系统配置为始终在/D_WINSOCKAPI_命令行上传递给编译器,这样就不会隐式包含任何 winsock 头文件。
  • 当我想包含winsock2.h时,我通过一个代理头文件来完成它,它为我做了一些预处理器的魔法。

这就是我的头文件的工作方式:

#pragma push_macro("_WINSOCKAPI_")
#undef _WINSOCKAPI_
#include <winsock2.h> 
#pragma pop_macro("_WINSOCKAPI_")

如果你这样做,那么你不需要#define WIN32_LEAN_AND_MEAN,你可以winsock2.h只在需要时使用。

于 2011-05-02T15:43:07.640 回答
1

请记住,WIN32_LEAN_AND_MEAN 是编译器性能优化。使用它可以让你的应用程序编译得更快一些,但代价是省略了一些 Windows API 中使用较少的部分。

您可以使用更精细的禁用之一(NOIMM 等),但这些对编译时间的影响甚至比 LEAN_AND_MEAN 更小。

除非您的项目非常大并且编译时间长而繁琐,否则我会停止使用 WIN32_LEAN_AND_MEAN。

马丁

于 2011-05-01T22:22:55.083 回答
1

我没有定义任何一个 LEAN_AND_MEAN,而是在包含 windows.h 之前为每个“NO”明确地执行以下操作

//  Exclude Input Method Manager (International stuff...one day)
#if !defined    NOIMM
    #define NOIME
    #define NOIMM
#endif

//  Exclude Metafile API
#if !defined    NOMETAFILE
    #define NOMETAFILE
#endif

这允许我使用相同的 StdAfx.h。使用 VS2010,我可以在 windows.h 之后包含 Winsock2 而不会发生冲突。

Stdafx 稍长一些,但清楚地记录了包含和排除的内容。

于 2011-04-29T15:27:23.803 回答
0

我不认为你想要什么是可能的。timeval 结构在 winsock.h 和 winsock2.h 中定义,因此您必须包含其中之一才能获得定义。如果不定义WIN32_LEAN_AND_MEAN,windows.h 将包含winsock.h;这使得无法包含winsock2.h。如果您定义 WIN32_LEAN_AND_MEAN,则不会自动包含两个 winsock 头文件,因此您不会获得 timeval 的定义。我认为您最好的选择是要求应用程序明确包含其中一个 winsock 标头。

于 2009-12-15T22:15:47.813 回答