使用windows.h和WIN32_LEAN_AND_MEAN时未定义timeval

时间:2009-12-15 18:18:17

标签: c++ windows winsock timeval

为了避免与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 个答案:

答案 0 :(得分: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有点长,但是清楚地记录了包含和排除的内容。

答案 1 :(得分:1)

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

您可以使用其中一个更细粒度的禁用(NOIMM等),但这些禁用对编译时间的影响比LEAN_AND_MEAN更小。

除非您的项目非常庞大且编译时间很长,否则我只会停止使用WIN32_LEAN_AND_MEAN。

马丁

答案 2 :(得分: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

答案 3 :(得分:0)

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