次の main() メソッドを使用して C++ アプリケーションを実行すると、すべて正常になります。
int main(int argc, char *argv[])
{
cout << "There are " << argc << " arguments:" << endl;
// Loop through each argument and print its number and value
for (int i=0; i<argc; i++)
cout << i << " " << argv[i] << endl;
return 0;
}
期待どおりの結果が得られ、引数が印刷されます。
ただし、_tmain を使用する場合:
int _tmain(int argc, char *argv[])
{
cout << "There are " << argc << " arguments:" << endl;
// Loop through each argument and print its number and value
for (int i=0; i<argc; i++)
cout << i << " " << argv[i] << endl;
return 0;
}
各引数の最初の文字のみを表示します。
この違いは何が原因で起きるのでしょうか?
ベストアンサー1
_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) とマルチバイト文字セット間の切り替えを容易にするために、 Unicode が有効な場合は としてコンパイルされ、それ以外の場合は として_tmain
コンパイルされるように定義されています。wmain
main
質問の 2 番目の部分については、パズルの最初の部分は、メイン関数が間違っていることです。 は引数wmain
を取るべきでありwchar_t
、 ではありませんchar
。コンパイラは関数に対してこれを強制しないためmain
、文字列の配列wchar_t
が関数に渡されmain
、文字列として解釈されるプログラムが生成されますchar
。
現在、Unicode が有効な場合に Windows で使用される文字セットである UTF-16 では、すべての ASCII 文字がバイトのペア\0
とそれに続く ASCII 値として表されます。
また、x86 CPU はリトルエンディアンであるため、これらのバイトの順序が入れ替わり、ASCII 値が最初に来て、その後にヌルバイトが続きます。
では、char 文字列では、文字列は通常どのように終了するのでしょうか? はい、null バイトで終了します。つまり、プログラムは、それぞれ 1 バイトの長さの一連の文字列を認識することになります。
一般に、Windows プログラミングを行う場合、次の 3 つのオプションがあります。
- 明示的に Unicode を使用します (wmain を呼び出し、char 関連の引数を取るすべての Windows API 関数に対して、
-W
関数のバージョンを呼び出します。CreateWindow の代わりに CreateWindowW を呼び出します)。また、 を使用する代わりにchar
、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 によってのみ定義されています。