Windows コーディング規則
Windows プログラミングを初めて使用する場合は、Windows プログラムが初めて表示されたときに混乱する可能性があります。 コードは 、DWORD_PTR や LPRECT などの奇妙な型定義で埋め尽くされ、変数には hWnd や pwsz (ハンガリー表記と呼ばれます) などの名前があります。 Windows のコーディング規則の一部については、少し時間を取って学習する価値があります。
Windows API の大部分は、関数またはコンポーネント オブジェクト モデル (COM) インターフェイスで構成されています。 C++ クラスとして提供される Windows API はごくわずかです。 (注目すべき例外は、2-D グラフィックス API の 1 つである GDI+ です)。
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++の ブール値とは異なり、 ブール 値を表す他の型とは異なります。 ヘッダー ファイル WinDef.h
には、 BOOL で使用する 2 つの値も定義されています。
#define FALSE 0
#define TRUE 1
ただし、 この TRUE の定義にもかかわらず、 BOOL 型を返すほとんどの関数は、ブール値の真偽を示す 0 以外の値を返すことができます。 したがって、常に次のように記述する必要があります。
// 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 は "long pointer" を表します。 現在のセグメントの外部のメモリ範囲に対処するには、長い ポインター (ファー ポインターとも呼ばれます) が必要でした。 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
を見た場合、行番号がサイズに追加されていることがわかります。これは、ほぼ確実にコードのバグです。
ハンガリー語表記のより一般的な形式では、プレフィックスを使用して型情報を提供します (DWORD の場合は dw、WORD の場合は w など)。
注意
C++ Core Guidelines では、プレフィックス表記 (ハンガリー表記など) は推奨されません。 「NL.5: 名前内のエンコード型情報を避ける」を参照してください。 内部的には、Windows チームは使用しなくなりました。 しかし、その使用はサンプルとドキュメントに残っています。