[解決済み] 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;
}
各引数の最初の文字が表示されるだけです。
この違いは何でしょうか?
解決方法は?
_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 固有の定義です。
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] utf8_general_ciとutf8_unicode_ciの違いは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】Enterキーを押して続行する
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)