Windows 程式碼撰寫慣例
如果您不熟悉 Windows 程式設計,當您第一次看到 Windows 程式時,它可能會不憑證。 程式碼會填入奇怪的類型定義 ,例如 DWORD_PTR 和 LPRECT,而變數的名稱如 hWnd 和 pwsz (稱為匈牙利文標記法) 。 請務必花點時間瞭解一些 Windows 程式碼慣例。
大部分的 Windows API 是由函式或元件物件模型所組成, (COM) 介面。 很少的 Windows API 會以 C++ 類別的形式提供。 (值得注意的例外狀況是 GDI+,這是其中一個 2D 圖形 API.)
Typedefs
Windows 標頭包含許多 typedef。 其中許多定義于標頭檔 WinDef.h 中。 以下是您經常會遇到的一些。
整數類型
資料類型 | 大小 | 簽署? |
---|---|---|
BYTE | 8 位元 | 不帶正負號 |
DWORD | 32 位元 | 不帶正負號 |
INT32 | 32 位元 | 簽署人 |
INT64 | 64 位元 | 簽署人 |
LONG | 32 位元 | 簽署人 |
LONGLONG | 64 位元 | 簽署人 |
UINT32 | 32 位元 | 不帶正負號 |
UINT64 | 64 位元 | 不帶正負號 |
ULONG | 32 位元 | 不帶正負號 |
ULONGLONG | 64 位元 | 不帶正負號 |
WORD | 16 位元 | 不帶正負號 |
如您所見,這些 typedef 中有一定數量的備援。 部分重迭只是因為 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
更常見的匈牙利文標記法形式會使用前置詞來提供類型資訊,例如,DWORD的dw和適用于WORD的w。
注意
C ++ 核心指導方針 不建議前置詞標記法 (例如,匈牙利文標記法) 。 請參閱 NL.5:避免名稱中的編碼類型資訊。 在內部,Windows 小組不再使用它。 但其使用仍會保留在範例和檔中。