Pythonから来ているC++の初心者として、なぜC++が(グローバル名前空間内の)関数外のコードを許可しないのか分かりません。これは、main()が呼び出される前に、あるいは他の関数が宣言される前に初期化を行うと便利なようです。 (私はコンパイラで議論しようとしているわけではありませんが、私はちょうどこのように実装する思考プロセスを知りたいと思います)。なぜ関数内にC++コードを含める必要がありますか?
答えて
Pythonプログラムを実行しているとき、インタプリタは上から順に実行されます下に行くと実行します。 C++では、それは起こりません。コンパイラは、すべての関数を小さな機械語コードに組み込み、リンカがそれをフックします。実行時に、オペレーティングシステムはmain
関数を呼び出し、そこからすべてが実行されます。そのコンテキストでは、関数の外のコードは無意味です - いつ実行されますか?
この回答は、私がC++で学習したことを多少光栄に思うという重要なアイデアで多くの助けになりました。それはコンパイルされた言語であるということです。 –
私はこれもCのケースだと思っていますか? –
はい、Cと同じです。 –
main()はプログラムへのアクセスポイントです。だから、あなたが書いて欲しいコードは、その時点から実行命令を出す必要があります。
静的変数はmain()が実行される前に開始されるため、それ以前に必要な変数をすべて開始することができます。
しかし、プログラムの状態を開始する実行コードが必要な場合は、プログラムの先頭で実行し、静的変数を乱用してコンストラクタを実行する必要があります。
これは、C++とPythonのスタイルの違いと考えることができます。しかし、それにはかなりの理由もあります。 CとC++では、コードの実行が始まる非常に明確で具体的な場所があります。それはmain()
関数の始まりです(もちろんこれは真実の近似に過ぎませんが、今のところそれを無視することができます実際には、C/C++プログラムはmain()
関数で開始して終了します。私の意見では、プログラムが実際に何をしているのかを理解したいときにはかなり役に立ちます。プログラムのハイレベルフローがより明確になりました。これとは対照的に、ファイルを介して関数とそれ以外のものの間にコードが散在しています。
よく整理されたPythonプログラムであっても、コードの本体をif __name__ == "__main__":
の下に置くのですか?
もう少し進んだものがあります。 main()
関数が呼び出される前にコードを実行する方法があります。ここではそのうちの一つだ:
#include <iostream>
using namespace std;
bool RunBeforeMain()
{
cout << "Before main()!" << endl;
return true;
}
// This variable here causes the above function to be called
bool ignore_this_variable = RunBeforeMain();
int main()
{
cout << "Start of main()" << endl;
return 0;
}
はまた、すべてのグローバル変数のコンストラクタとクラスのすべての
static
のメンバーといくつかのプラットフォーム依存のものが
main()
前に実行されています。同様に、
main()
の終了後にコードを実行する方法もあります。これらは通常、
main()
が開始される前に構築されたオブジェクトのデストラクタであり、関数は
atexit()
関数で登録されています。
- 1. 関数宣言にパラメータ名を含める必要がありますか?
- 2. なぜstack.cをstack.cに含める必要がありますか?
- 3. ユーザー定義関数に列を含める必要があります。
- 4. Oracle関数をC#コードに変換する必要があります
- 5. C++なぜ拡張クラス内の関数のスコープを指定する必要がありますか?
- 6. なぜコンポーネントデータを関数にする必要がありますか?
- 7. HTML5にtype = "value"を含める必要がありますか?
- 8. PHP上にスーパークラスを含める必要がありますか?
- 9. ヘッダーファイルにソースコードを含める必要がありますか?
- 10. プロジェクトにvalidation-apiを含める必要がありますか?
- 11. バルクデータをグラフに含める必要がありますか?
- 12. 画像にaltを含める必要がありますか?
- 13. なぜgcc 4.6にSTLヘッダーを含める必要はありませんか?
- 14. C#はシングルトンに静的メソッドを含める必要がありますか?
- 15. なぜメソッド関数でsetIntervalにバインドする必要がありますか?
- 16. なぜ変数をリセットする必要がありますか?
- 17. strings.xmlファイルに整数を含める必要がありますか?
- 18. サポート-v7/appcompatを含める必要がありますか?
- 19. JSONにnull値を含める必要があります
- 20. Shibboleth SAML2 LogoutRequestにNameIDを含める必要があります
- 21. なぜスカラの一部の関数を渡す必要がありますか?
- 22. 要素のクリックイベントに内部関数をバインドする必要があります
- 23. なぜstd :: bind'ed関数に移動する必要はありませんか?
- 24. 要求ごとにcsrfトークンを含める必要がありますか?
- 25. REST - エンドポイントに要約データを含める必要がありますか?
- 26. ノードのWeb要求を含むURLをホストに含める必要があるのはなぜですか?
- 27. MVCに適応するためにクラス内に関数を実装する必要がありますか?
- 28. なぜC++テンプレートパラメータをクラス型として宣言する必要がありますか?関数テンプレートの
- 29. なぜC++のprintf関数で型指定子を指定する必要がありますか?
- 30. ソースファイルを含める必要があるのはなぜですか?
機能がない場合、そのようなコードはどのように実行されますか? –
「main」の前にコードを実行して、面倒なグローバルコードを伴わない方法もあります。 – chris
そんなに役に立たないようです。 –