簡體   English   中英

使用Windows.h和WIN32_LEAN_AND_MEAN時未定義時間

[英]timeval undefined when using windows.h and WIN32_LEAN_AND_MEAN

為了避免與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,因為它可能已經由父應用程序包含的標頭定義了?

我沒有定義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稍長一些,但是清楚地記錄了包含和排除的內容。

請記住,WIN32_LEAN_AND_MEAN是編譯器性能的優化。 使用它可以使您的應用程序編譯更快一些,而忽略了Windows API中一些不常用的部分。

您可以使用一種更精細的禁用(NOIMM等),但是這些對編譯時間的影響甚至比LEAN_AND_MEAN的影響小。

除非您的項目非常大且編譯時間長且繁瑣,否則我只會停止使用WIN32_LEAN_AND_MEAN。

馬丁

這是我處理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

我認為您想要的是不可能的。 timeval結構是在winsock.h和winsock2.h中定義的,因此您必須包括其中之一來獲取定義。 如果您未定義WIN32_LEAN_AND_MEAN,則windows.h將包含winsock.h; 這使得無法包含winsock2.h。 如果定義WIN32_LEAN_AND_MEAN,則不會自動包含兩個winsock頭文件,因此不會獲得timeval的定義。 我認為您最好的選擇是要求應用程序顯式包括winsock標頭之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM