Windows プログラムでは,long や unsigned int といった型名の代わりに,LONG や UINT といった独自の型名が多く使われます。これらは主に, typedef で定義されたものです。
typedef long LONG;
typedef unsigned int UINT;
型の別名はwindef.h や winnt.hで定義されています。
基本的なデータ型
Win32が定義する主なデータ型
Win32における別名 | C++のデータ型 | 解説 |
UCHAR, BYTE | unsigned char | 8ビットの符号なし整数 |
USHORT, WORD | unsigned short | 16ビットの符号なし整数 |
LONG | long | 32ビットの符号付き整数 |
DWORD | unsigned long | 32ビットの符号なし整数 |
LONGLONG | 64ビットの符号付き整数 | |
ULONGLONG | 64ビットの符号なし整数 | |
CHAR | char | |
WCHAR | wchar_t | wchar_t 型は 符号なし16ビット ※ |
SHORT | short int | |
USHORT, WORD | unsigned short int | |
INT | signed int | |
UINT | unsigned int | |
FLOAT | float | |
DOUBLE | double | |
VOID | void |
※ wchar_t型は、日本語のようにひらがな・カタカナ・漢字など多くの文字があって1バイトでは表現できない言語を表すときに1文字を2バイトで表すワイド文字のこと。1バイト以上の文字のことをマルチバイト文字と呼ぶ。
主なポインター型
型の識別子の先頭にLPやPという接頭辞を指定するとポインタ型になるという規則がある。例えば、DWORD型へのポインタはPDWORD型となる。PDWORD型は「DWORD * 」と同じ意味となります。
Win32における別名 | C++のデータ型 |
PUCHAR, PBYTE, LPBYTE | unsigned char * |
PSHORT | short * |
PUSHORT, PWORD, LPWORD | unsigned short * |
PINT, LPINT | int * |
PUINT | unsigned int * |
PLONG | long * |
PULONG, PDWORD, LPDWORD | unsigned long * |
PFLOAT | float * |
PVOID, LPVOID | void * |
LPCVOID | const void * |
LPとPの接頭辞に違いはない。「LPDWORD」、「PDWORD」、「DWORD *」は同じ型を表している。PはPointerの頭文字、LはLongの頭文字を表している。LPはLong Pointerのことを表しているが、これは16ビットWindows時代の名残。
文字列型
constを表すときは間に「C」が入る。例えば、「 char * 」は「 LPSTR 」となり「 const char * 」は「 LPCSTR 」となる。
Win32における別名 | C++のデータ型 |
PCHAR, LPCH, PCH, NPSTR, LPSTR, PSTR | char * |
LPCCH, PCCH, LPCSTR, PCSTR | const char * |
PWCHAR, LPWCH, PWCH, NWPSTR, LPWSTR, PWSTR | wchar_t * |
LPCWCH, PCWCH, LPCWSTR, PCWSTR | const wchar_t * |
PTCHAR, LPTCH, PTCH, PTSTR, LPTSTR | TCHAR * |
LPCTCH, PCTCH, PCTSTR, LPCTSTR | const TCHAR * |
TCHARとは
TCHARの定義を見てみると、下記のようになっている。
#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif
UNICODEが定義されていれば「WCHAR」、定義されていなければ「char」ということ。UNICODEの定義は、 VisualStudioの「プロジェクト」を右クリックし、「プロパティ」からプロジェクトの設定画面を開き、「構成プロパティ」>「全般」の中にある 「文字セット」を「マルチバイト文字セットを使用する」と「 Unicode 文字セットを使用する 」で切り替えられる。
TEXT()とは
UNICODE設定とマルチバイト設定の差異を解消するためのマクロ。
- L”文字列”
- TEXT(”文字列”)
- _T(”文字列”)
L”文字列”は、UNICODE限定の文字列という意味。_T() とTEXT()は、どちらも同じ動きをするマクロで、UNICODEが定義されていればL”文字列”、定義されていなければ”文字列”としてくれる。
_T() は tchar.h 、TEXT()は winnt.h の中にあり、定義してあるヘッダファイルが違うだけで、どちらも同じように使うことができる。
論理型 BOOL および BOOLEAN
BOOLとBOOEANは次のように定義
typedef int BOOL;
typedef BYTE BOOLEAN;
TRUE と FALSE
TRUEとFALSEは次のように定義
#define FALSE 0
#define TRUE 1