1. ホーム
  2. c++

[解決済み] main()は本当にC++のプログラムの始まりなのか?

2022-06-22 20:57:47

質問

C++標準の$3.6.1/1節を読んでください。

プログラムは,グローバルな というグローバルな関数が含まれていなければなりません。 メイン と呼ばれるグローバル関数があり、これが 指定された スタート である。

では、このコードを考えてみましょう。

int square(int i) { return i*i; }
int user_main()
{ 
    for ( int i = 0 ; i < 10 ; ++i )
           std::cout << square(i) << endl;
    return 0;
}
int main_ret= user_main();
int main() 
{
        return main_ret;
}

このサンプルコードは、私が意図したとおりに、0から9までの整数の2乗を表示するものです。 の前に に入力し main() 関数に入る前に、この関数がプログラムのスタートとなります。

また、コンパイル時に -pedantic オプションでコンパイルしました。エラーも出ないし、警告さえも出ない!

だから私の質問はです。

このコードは本当にStandardに準拠しているのでしょうか?

もし標準に準拠しているのであれば、標準に書いてあることは無効にならないのでしょうか? main() は、このプログラムの始まりではありません user_main() の前に実行された main() .

グローバル変数を初期化するために、私は理解しました。 main_ret を使用すること、また use_main() が先に実行されますが、それは全く別の話です。重要なのは、それが が実行されることです。 として、規格から引用した文 $3.6.1/1 を無効にしています。 main() 開始 ではありません。 終了 この プログラムです!


EDITです。

スタート」という言葉をどのように定義しますか?

それは、次のフレーズの定義に帰結します。 "プログラムの開始"。 . では、具体的にどのように定義するのでしょうか?

どのように解決するのか?

いいえ、C++ は main を呼び出す前に環境を設定するために多くのことを行いますが、main は C++ プログラムのユーザが指定した部分の正式な開始です。

環境設定の一部は制御できません (std::cout を設定する初期コードのように; しかし、静的グローバル ブロック (静的グローバル変数の初期化のため) のように制御可能な環境もあります。 main の前に完全な制御ができないので、静的ブロックが初期化される順序を完全に制御できないことに注意してください。

main の後では、実行する命令とその順序を指定できるという意味で、コードは概念的にプログラムを完全に制御することができます。 マルチスレッドはコードの実行順序を並べ替えることができますが、C++ ではコードのセクションが (おそらく) 順不同に実行されるように指定されているため、まだ制御可能な状態になっています。