簡體   English   中英

我可以#include定義DWORD的最小Windows頭文件是什么?

[英]What is the smallest Windows header I can #include to define DWORD?

我有一個我自己的小頭文件,它聲明了幾個函數,其中一個函數的返回類型為DWORD 我不願意在windows.h拖動以獲得此類型的官方定義,因為該文件很大,而且我的標題將用於許多其他方式不需要它的源模塊。

當然,在實踐中我知道DWORD只是unsigned int ,但如果可能的話,我更喜歡使用更衛生的方法來包含官方頭文件。

這個頁面上,它表示DWORD是在windef.h定義的,但不幸的是,只包含這個小文件直接導致編譯錯誤 - 顯然它希望被其他頭文件包含。 (另外,我的文件是頭文件的事實也意味着我不能只聲明WIN32_LEAN_AND_MEAN ,因為#includes我的文件的源文件可能需要保留未定義。)

有任何想法嗎? 我知道這不是世界末日 - 我可以繼續#include <windows.h> - 但是有人可能會有更好的主意!

[編輯]感謝您的回復。 對於那些建議使用不同類型的人,讓我解釋為什么在這種情況下不可取:我在不同的源文件中設置了兩個函數的不同平台特定版本,並要求CMake配置檢測當前平台並選擇要構建的那個。 在Windows上,我的功能如下:

typedef DWORD TimePoint;
TimePoint GetTimeNow(void);
double TimeDifference(TimePoint start, TimePoint end);

Windows版本的GetTimeNow()只調用Windows API timeGetTime() ,它返回類型為DWORD ,因此它必須具有相同的返回類型。 (在其他平台上, TimePoint將具有不同的類型,例如UNIXy平台上的struct timeval 。)實際上, TimePoint類型的值是不透明的,您可以用它們做的唯一事情就是將它們中的兩個傳遞給TimeDifference()來測量兩秒之間經過的時間。 這實現了跨平台開發。 不幸的是,它仍然意味着客戶端代碼必須知道TimePoint的具體類型。

我相信你曾經能夠包含winbase.h,但似乎不再是這種情況了。 我見過的所有資源都推薦使用windows.h,並選擇WIN32_LEAN_AND_MEAN。 正如您所指出的,后一種優化對您沒有幫助。

你可以這樣做。

#ifndef _WINDEF_
typedef unsigned long DWORD;
#endif

不干凈,但效率很高。 這種typedef不太可能改變。

包括Windows.h並使用預編譯的頭文件。 順便說一句,你可以定義WIN32_LEAN_AND_MEAN,然后再取消它!

DWORD總是一個32位無符號整數,因此使用DWORDunsigned longuint32_t並不重要。 如果所有三種類型都引用32位無符號int,則編譯器將認為它們是等效的。

由於這是特定於平台的文件的一部分,因此我認為您不必擔心可移植性。 哎呀,深入了解標題以找到DWORD的本機類型,然后將該typedef放入標題中。 C編譯器接受重復的typedef,只要它們具有相同的底層類型即可。

Use this file: include <IntSafe.h>

我要說自己定義一下。 這樣,它更加獨立於平台(當然,我不知道代碼的其余部分是否需要Windows)。 如果您不想這樣做,請使用預編譯的標頭。

你為什么不改為定義返回int的函數? 這是一種高度可移植的類型,完全將你的代碼與邪惡的帝國微軟分開。

不要使用DWORD。 我看到太多的Windows代碼后來被移植到其他平台。 當每個人都有自己的定義時,那些DWORD就成了一個真正的問題。 我認為在接口中使用Windows特定類型沒有任何充分的理由。

即使你的代碼永遠不會被移植到任何其他平台,我仍然認為代碼應該使用本機類型或你自己的類型(例如,MyInt32,MyUInt64等),但是沒有來自windows.h。

如果您擔心當您的跨平台程序在Windows上運行時,它會加載太多Windows DLL,因為您的源代碼有#include <windows.h>,我認為您太擔心了。 甚至記事本也必須加載已知宇宙的一半,並且有時會加載和執行它。

如果您擔心當其他開發人員使用Windows時,您的跨平台.h文件會在編譯環境中造成大量的命名空間污染,我認為您太擔心了。 99.999%的Windows項目在進入.h文件之前已經執行了#include <windows.h>。

你有<wtypes.h>嗎? 因為在其中,我看到:

#ifndef _DWORD_DEFINED
#define _DWORD_DEFINED
typedef unsigned long DWORD;

#endif // !_DWORD_DEFINED

這個文件位於“... \\ VC98 \\ INCLUDE”這里..這是用於VC6所以我認為它將在更高版本中。

我跟OP一樣,並通過包含所述標題來解決它。

怎么樣 - #include <minwindef.h>

暫無
暫無

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

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