为了避免与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,因为它可能已经被父应用程序包含的头部定义了?
答案 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标头。