1. ホーム
  2. c++

[解決済み] C++の_tmain()とmain()の違いは何ですか?

2022-03-13 21:30:01

質問

以下の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;
}

各引数の最初の文字が表示されるだけです。

この違いは何でしょうか?

解決方法は?

_tmain はC++には存在しません。 main があります。

_tmain はMicrosoftの拡張機能です。

main は、C++標準によれば、プログラムのエントリポイントである。 この2つのシグネチャのうち、どちらかを持っています。

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

マイクロソフトは、2つ目の署名をこれに置き換えるwmainを追加しました。

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

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

ご質問の後半部分ですが、まず、主関数が間違っていることが原因です。 wmain を取る必要があります。 wchar_t 引数ではなく char . コンパイラは、このことを main 関数の配列が表示されるプログラムが作成されます。 wchar_t の文字列が渡されます。 main という関数があり、この関数はそれを char という文字列があります。

さて、Unicode が有効なときに Windows で使用される文字セットである UTF-16 では、すべての ASCII 文字はバイトの組として表されます。 \0 の後にASCII値が続きます。

そして、x86CPUはリトルエンディアンなので、これらのバイトの順番は入れ替わり、ASCII値が最初に来て、その後にNULLバイトが来るようになります。

そして、char文字列の場合、通常、文字列はどのように終了するのでしょうか。そう、ヌルバイトである。つまり、プログラムは1バイト長の文字列をたくさん見ていることになります。

一般に、Windowsのプログラミングを行う場合、3つの選択肢があります。

  • Unicode を明示的に使用する (wmain を呼び出し、char 関連の引数を取るすべての Windows API 関数に対して、"Unicode" を呼び出す)。 -W バージョンの関数を使用する。CreateWindowの代わりにCreateWindowWを呼び出す)。また char 使用 wchar_t などなど
  • Unicodeを明示的に無効化する。main を呼び出し、CreateWindowA を呼び出し、そして char を文字列に使用します。
  • 両方を許可する。(call _tmain, and CreateWindow, which resolve to main/_tmain and CreateWindowA/CreateWindowW), and use TCHAR instead of char/wchar_t.です。

windows.hで定義されている文字列型も同様です。 LPCTSTR は LPCSTR か LPCWSTR に解決され、char か wchar_t を含む他のすべての型には、常に -T- バージョンが存在し、代わりに使用することができます。

これらはすべてマイクロソフト固有のものであることに注意してください。TCHAR は C++ の標準型ではなく、windows.h で定義されたマクロです。wmain と _tmain も Microsoft 固有の定義です。