5

有効な C++main署名は次のとおりです。

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

mainただし、初期化子リストを取ることを宣言することは許可されていません:

int main(std::initializer_list<char *> args)

私の知る限り、イニシャライザリストは、ポインタのペアまたはポインタ(これはargvパラメータである可能性があります)と長さ(これはパラメータから推測される可能性があります)として実装できargc、そのストレージは自動、一時、または静的な読み取り専用メモリである可能性があります場合によります

したがってstd::initializer_list<char *>、コマンドラインパラメーターを問題なく処理および管理できると思いmainますが、C++ 11標準の初期化子リストの承認後にこの架空の署名が追加されなかったのはなぜだろうかと思っています。尋ねています:

  • イニシャライザリストをmain唯一のパラメータとして許可することで生じる欠点や問題は何ですか? (私は何も考えられませんでした)。
  • この追加 (またはその他の変更) を標準化委員会に提案する正しい方法はどれですか?
4

3 に答える 3

4

プログラムで指定する方法は 2 つありますがmain()、ほとんど (すべて?) の C++ ランタイムの現在の実装ではmain()、同じ方法で関数を呼び出します (宣言(int, char *[])方法に関係なく、引数を渡します)。main()あなたの提案では、すべての実装の C++ ランタイムが、main()使用しているプログラムの種類を特定し、適切な を呼び出す必要がありますmain()。この機能が本当に必要な場合はmain(int, char *[])、引数をオブジェクト ( などvector<>) のような初期化子リストに変換し、選択した新しいエントリ ポイント関数を呼び出す の実装をいつでも提供できます。

提案を提出するプロセスは、標準 C++ の Web サイトで説明されています。基本的な手順は次のとおりです。(1) Usenet グループ/メーリング リストでアイデアを浮かび上がらせます。(2) 提案を起草し、フィードバックを求め、それに応じて提案を更新します。(3) 提案が受け入れられるまでプロセスを繰り返します。

于 2013-09-30T17:07:19.903 に答える
4

ライブラリ (ただし、3.6.1 [basic.start.main] パラグラフ 2、最初の文:「実装はmain関数を事前定義してはならない」による標準 C++ ライブラリではありません) は、関数を定義main()してそれを実装するだけでよいことに注意してください。適切な方法で、たとえば次のように呼び出しapp_main()ます。

#include <initializer_list>
#include <string>
#include <vector>
extern int app_main(std::vector<std::string> const&);

int main(int ac, char* av[]) {
    return app_main(std::vector<std::string>(av, av + ac));
}

main()オーバーロードできないため (3.6.1 [basic.start.main] パラグラフ 2、2 番目の文:「この関数はオーバーロードされてはならない」によると)、エントリ ポイントには別の名前が必要です。std::initializer_list<T>を使用する以外に構築できないため、{ ... }とは異なる型std::initializer_list<T>を使用する必要があります。上記の実装では、char*std::stringオブジェクトに変換することも選択しています。

上記の関数を使用するには、アプリケーションを実装するだけapp_main()で呼び出されます。

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>

int app_main(std::vector<std::string> const& args) {
    std::cout << "received the arguments: ";
    std::copy(args.begin(), args.end(),
              std::ostream_iterator<std::string>(std::cout, " "));
    return EXIT_SUCCESS; // return statement can't be omitted, of course
}
于 2013-09-30T18:06:52.000 に答える
0

技術的な理由ではなく、C との互換性を考慮したためだと思います。Cから継承されたものはたくさんあります。

于 2013-09-30T16:57:25.910 に答える