C++ の _tmain() と main() の違いは何ですか? 質問する

C++ の _tmain() と main() の違いは何ですか? 質問する

次の 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

_tmainC++ には存在しません。main存在します。

_tmainMicrosoft の拡張機能です。

mainC++ 標準によれば、これはプログラムのエントリ ポイントです。次の 2 つのシグネチャのいずれかを持ちます。

int main();
int main(int argc, char* argv[]);

Microsoft は、2 番目の署名を次のように置き換える wmain を追加しました。

int wmain(int argc, wchar_t* argv[]);

そして、Unicode (UTF-16) とマルチバイト文字セット間の切り替えを容易にするために、 Unicode が有効な場合は としてコンパイルされ、それ以外の場合は として_tmainコンパイルされるように定義されています。wmainmain

質問の 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 を呼び出します)。また、 を使用する代わりにcharwchar_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 によってのみ定義されています。

おすすめ記事