Windows 編碼慣例
如果您不熟悉 Windows 程式設計,當您第一次看到 Windows 程式時,它可能會令人不安。 程序代碼會填入奇怪的類型定義,例如 DWORD_PTR 和 LPRECT,而變數的名稱如 hWnd 和 pwsz (稱為匈牙利表示法)。 請務必花點時間瞭解一些 Windows 程式代碼撰寫慣例。
絕大多數 Windows API 是由函式或元件物件模型 (COM) 介面所組成。 很少有 Windows API 以 C++ 類別的形式提供。 (值得注意的例外是 GDI+,其中一個 2D 圖形 API。
Windows 標頭包含許多 typedefs。 其中許多定義於頭檔 WinDef.h 中。 以下是您經常會遇到的一些事物。
數據類型 | 大小 | 簽署? |
---|---|---|
位元組 | 8 位元 | 無符號 |
DWORD | 32 位 | 無符號 |
INT32 | 32 位 | 簽署 |
INT64 | 64 位 | 已簽名 |
LONG | 32 位 | 已簽署 |
LONGLONG | 64 位 | 已簽署 |
UINT32 | 32 位 | 無符號 |
UINT64 | 64 位 | 無符號 |
ULONG | 32 位 | 無符號 |
ULONGLONG | 64 位 | 無符號 |
WORD | 16 位 | 無符號 |
如您所見,這些 typedefs 中有一定程度的重複。 部分重疊僅由於 Windows API 的歷史。 此處列出的類型具有固定大小,且大小在32位和64應用程式中都相同。 例如,DWORD 類型一律為 32 位寬。
BOOL 是 int 的類型別名,不同於 C++ 的 bool,以及代表 布爾值 值的其他類型。 頭檔 WinDef.h
也會定義兩個值,以搭配 BOOL使用。
#define FALSE 0
#define TRUE 1
雖然 TRUE被如此定義,但是大部分傳回 BOOL 類型的函式都可以用任何非零值來表示布爾真值。 因此,您應該一律撰寫這個內容:
// Right way.
if (SomeFunctionThatReturnsBoolean())
{
...
}
// or
if (SomeFunctionThatReturnsBoolean() != FALSE)
{
...
}
而不是這樣:
if (result == TRUE) // Wrong!
{
...
}
BOOL 是整數類型,而且無法與 C++ 的 bool交換。
Windows 會定義表單的許多資料類型,指針對 X。 這些名稱中通常會有前置詞 P- 或 LP-。 例如,LPRECT 是 RECT的指標,其中 RECT 是描述矩形的結構。 下列變數宣告相等。
RECT* rect; // Pointer to a RECT structure.
LPRECT rect; // The same
PRECT rect; // Also the same.
在 16 位架構(16 位 Windows)上,有 2 種類型的指標,P 為「指標」,LP 代表「長指標」。 需要長指標(也稱為 遠指標),才能處理目前區段外的記憶體範圍。 LP 前置詞已保留,以便更輕鬆地將 16 位程式代碼移植到 32 位 Windows。 目前沒有任何區別,而且這些指標類型都是相等的。 避免使用這些前置詞;或者,如果您必須使用一個,請使用 P。
下列數據類型一律是指針的大小,也就是32位應用程式中的32位寬,64位應用程式中的64位寬。 大小是在編譯時期決定的。 當 32 位應用程式在 64 位 Windows 上執行時,這些數據類型仍為 4 個字節寬。 (64 位應用程式無法在32位 Windows 上執行,因此不會發生反向情況。
- DWORD_PTR
- INT_PTR
- LONG_PTR
- ULONG_PTR
- UINT_PTR
在整數可能轉換成指標的情況下,會使用這些類型。 它們也可用來定義指標算術的變數,以及定義迴圈計數器,逐一查看記憶體緩衝區中位元組的完整範圍。 一般而言,它們出現在現有的 32 位值擴充為 64 位的 Windows 64 位系統中。
匈牙利記號 是將前置詞新增至變數名稱的做法,以提供變數的其他資訊。 (記號的發明家查理斯·西蒙尼是匈牙利人,因此的名字)。
匈牙利表示法以原始形式提供 語意 變數的相關信息,告訴您預期的用途。 例如,i 表示索引,cb 表示位元元組大小(“位元組計數”),rw 和 col 平均數據列和數據行數。 這些前置詞的設計目的是避免在錯誤的內容中意外使用變數。 例如,如果您看到表達式 rwPosition + cbTable
,您就會知道行號正在新增至大小,這幾乎肯定是程式碼中的 Bug。
更常見的匈牙利表示法形式會使用前置詞來提供 類型 資訊,例如,dwDWORD,w WORD的。
注意
C++核心指導方針 禁止前置表示法(例如匈牙利表示法)。 請參閱 NL.5:避免在名稱中包含編碼類型資訊。 在內部,Windows 小組不再使用它。 但其使用仍保留在範例檔案和文件中。