_tmain
C ++には存在しません。main
します。
_tmain
Microsoftの拡張機能です。
main
C ++標準によると、プログラムのエントリポイントです。次の2つのシグネチャのいずれかがあります。
int main();
int main(int argc, char* argv[]);
Microsoftは、2番目の署名をこれで置き換えるwmainを追加しました:
int wmain(int argc, wchar_t* argv[]);
そして、Unicode(UTF-16)とマルチバイト文字セットを簡単に切り替えることができるように_tmain
、Unicodeが有効になっている場合はとしてコンパイルされwmain
、そうでない場合はとしてコンパイルされるように定義していmain
ます。
質問の2番目の部分については、パズルの最初の部分はあなたの主な機能が間違っているということです。ではなくwmain
、wchar_t
引数を取る必要がありますchar
。コンパイラーはmain
関数に対してこれを強制しないため、wchar_t
文字列の配列がmain
関数に渡され、それをchar
文字列として解釈するプログラムを取得します。
現在、UTF-16では、Unicodeが有効になっているときにWindowsによって使用される文字セットであり、すべてのASCII文字は\0
、ASCII値が後に続くバイトのペアとして表されます。
また、x86 CPUはリトルエンディアンであるため、これらのバイトの順序が入れ替わり、ASCII値が最初に来て、その後にnullバイトが続きます。
そしてchar文字列では、文字列は通常どのように終了しますか?はい、nullバイトです。したがって、プログラムは、それぞれが1バイト長の一連の文字列を認識します。
一般に、Windowsプログラミングを行う場合、3つのオプションがあります。
- 明示的にUnicodeを使用します(wmainを呼び出し、char関連の引数を受け取るすべてのWindows API関数については
-W
、関数のバージョンを呼び出します。CreateWindowの代わりにCreateWindowWを呼び出します)。そして、char
use wchar_t
などを使用する代わりに
- Unicodeを明示的に無効にします。mainとCreateWindowAを呼び出し
char
、文字列に使用します。
- 両方を許可します。(main _tmainとCreateWindowA / CreateWindowWに解決される_tmainとCreateWindowを呼び出します)、char / wchar_tの代わりにTCHARを使用します。
同じことがwindows.hで定義された文字列型にも当てはまります。LPCTSTRはLPCSTRまたはLPCWSTRのいずれかに解決され、charまたはwchar_tを含む他のすべての型では、代わりに使用できる-T-バージョンが常に存在します。
これはすべてMicrosoft固有であることに注意してください。TCHARは標準のC ++タイプではなく、windows.hで定義されたマクロです。wmainと_tmainもMicrosoftによってのみ定義されています。