1. ホーム
  2. c++

[解決済み] C++のmain()内部で何も宣言しないのに、コンパイル後にアプリケーションが動作するのはなぜですか?

2023-04-17 14:06:42

質問

あるインタビューで、こんな質問をされました。

あなたの友人は、コンソールにフィボナッチ数を表示する単一のソースコード・ファイルをあなたに渡しました。 フィボナッチ数をコンソールに表示します。main()ブロックは空であり、内部には何のステートメントもないことに注意してください。 ブロックは空で、その中には何のステートメントもないことに注意してください。

これがどのように可能であるかを説明してください (ヒント: グローバルインスタンス!)

私は本当にこれについて知りたいのです、どのようにしてそのようなことが可能なのか!?

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

として実装されている可能性が高いです(もしくはその亜種)。

 void print_fibs() 
 {
       //implementation
 }

 int ignore = (print_fibs(), 0);

 int main() {}

このコードでは、グローバル変数 ignore に入る前に初期化する必要があります。 main() 関数に入る前に初期化する必要があります。さて、グローバルに初期化するために print_fibs() を実行する必要があります。この場合、フィボナッチ数を計算し、それを表示することができます。似たようなことを、私は次の質問で示しました(ずっと前に質問したものです)。

このようなコードは安全ではないので、一般的には避けた方が良いことに注意してください。 例えば std::cout オブジェクトが初期化されない場合 print_fibs() が実行されたときに初期化されないかもしれません。 std::cout は関数の中で何をするのでしょうか?しかし、他の状況で、そのような初期化順序に依存しないのであれば、初期化関数を呼び出すのが安全です(これはCやC++では一般的な方法です)。