27

main()関数の引数を使用して、コマンドラインで引数を取るプログラムを作成しようとしていました。(基本的な)C ++プログラマーとして(Cスタイルのポインターと配列をよく知っていても)、char*文字列とC配列を使用することはほとんどありませんでした。main()私は引数を取り、それを変換するためにいくつかを費やしましたstd::string...それで、自分自身に尋ねました:なぜC ++でmain()関数がオーバーロードされstd::vector<std::string> argvて古いものの代わりをとらないのchar* argv[]ですか?

「オーバーロード」とは、プログラマーが作成した通常の関数のオーバーロードではなく、とのmain()ような関数の共存を意味します。int main()int main(int argc, char *argv[])

4

5 に答える 5

33

なぜ標準にないのですか?単純:

誰もそれを提案しなかったからです。

誰かがそれについて提案を書き、それから他の人々にそれに投票してそれを組み込むようにさせるので、物事はC++標準に入ります。誰かが実際にそれを起こさせたくない限り、それは起こらない。

そして、この機能が実際にどれほど些細なことかを考えると、

int main(int argc, char **argv)
{
    std::vector<std::string> args(argv, argv + argc);
    ...
}

それは本当に必要ではありません。これは便利な機能であり、他の機能に比べて便利な機能すらありません。

于 2012-08-22T12:23:15.627 に答える
20

C ++でmain()関数がオーバーロードされて、古いchar *argv[]の代わりにstd::vectorargvを取得する理由

それはライブラリへの依存<string>を要求するからです。C ++の哲学は、常に「使用しないものにお金を払わない」です。誰かが提供する自動メモリ管理を望まない場合string、それらを強制することはできません。
2番目のビュー:一部のプラットフォームでライブラリがサポートされていない場合、C++プログラムを開始できません!!

それどころか、int引数char**は組み込みの独立した型です。必要なことを正確に実行するカスタムラッパーをいつでも作成できますmain()

編集:AProgrammerのコメントについて:
それmain(vector<string>)が許可されていると仮定します。プラットフォームがすべてのC++機能に準拠しているが、標準ライブラリをサポートしていない場合、プラットフォームは非標準に準拠するようになります。

于 2012-08-22T12:09:22.077 に答える
4

主な理由は、通常の実装がextern "C"varargsを使用して関数にするためだと思います。多くの実装では、mainを呼び出すのはCランタイムライブラリです。

これを回避する方法はたくさんありますが、引数を必要なものに変換するのがいかに簡単であるかを考えると、どれもわざわざする価値はないようです。

于 2012-08-22T12:34:40.490 に答える
2

コンパイラが次のように定義されたメインをコンパイルするのは簡単です。

int main(std::vector<std::string> args) {
    ...
}

それが書かれているように

int main(int __argc, char **__argv) {
    std::vector<std::string> args(__argv, __argv+__argc);
    ...
}

だけでなく、カスタムコンテナも含め、任意のコンテナを許可するのもほぼ同じくらい簡単std::vector<std::string>です。しかし、それは標準ではありません。なぜなら、これが標準にない理由に対する標準的な答えは、誰もそれを提案せず、十分な人々にそれが良い考えであると納得させたからです。提案はなかったと思うので、おそらくそれを拒否する理由はありません。変更はおそらく、関係者のほとんどが気にするのは簡単です。

于 2012-08-22T12:23:23.573 に答える
1

基本的に、std :: vectorは(メモリレイアウトなどで)char*の配列と同じではありません。これを許可するには、コンパイラに新しいメイン宣言を認識させ、文字列のベクトルを作成したエントリにラッパーを追加する必要があります。

あなたがそれをしているとすれば、あなたはargcも捨てて、mainの宣言をするほうがよいでしょう。

int main(std::vector<std::string> argv)

しかし、それはコンパイラーにとってはうまくいきます。あなたはそれが価値があると思った多くの人々を得る必要があるでしょう。

それ以外の場合は、自分でそれを行うことができます

int main(int argc, char **argv)
{
    std::vector<std::string> args;
    args.reserve(argc);
    for (std::size_t arg = 0; arg < argc; ++arg)
    {
         args.push_back(argv[i]);
    }
    return mymain(args);
}

コードがコンパイルまたは動作することは保証されていません。私は頭のてっぺんからコードを書きました。

または(より良い、AProgrammerのおかげで)

int main(int argc, char **argv)
{
    return mymain(std::vector<std::string>(argv, argv + argc));
}
于 2012-08-22T12:11:10.783 に答える