[解決済み] main()は本当にC++のプログラムの始まりなのか?
質問
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++ ではコードのセクションが (おそらく) 順不同に実行されるように指定されているため、まだ制御可能な状態になっています。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++の余分な資格エラー
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] noexceptを本当に使うべきはいつですか?
-
[解決済み] なぜJavaのmainメソッドは静的なのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】GDBで現在のアセンブリ命令を表示する