Windows 編碼慣例

如果您不熟悉 Windows 程式設計,當您第一次看到 Windows 程式時,它可能會令人不安。 程序代碼會填入奇怪的類型定義,例如 DWORD_PTRLPRECT,而變數的名稱如 hWndpwsz (稱為匈牙利表示法)。 請務必花點時間瞭解一些 Windows 程式代碼撰寫慣例。

絕大多數 Windows API 是由函式或元件物件模型 (COM) 介面所組成。 很少有 Windows API 以 C++ 類別的形式提供。 (值得注意的例外是 GDI+,其中一個 2D 圖形 API。

Typedefs

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 表示位元元組大小(“位元組計數”),rwcol 平均數據列和數據行數。 這些前置詞的設計目的是避免在錯誤的內容中意外使用變數。 例如,如果您看到表達式 rwPosition + cbTable,您就會知道行號正在新增至大小,這幾乎肯定是程式碼中的 Bug。

更常見的匈牙利表示法形式會使用前置詞來提供 類型 資訊,例如,dwDWORDw WORD

注意

C++核心指導方針 禁止前置表示法(例如匈牙利表示法)。 請參閱 NL.5:避免在名稱中包含編碼類型資訊。 在內部,Windows 小組不再使用它。 但其使用仍保留在範例檔案和文件中。

下一個

處理字串