2013-03-11 21 views
5

Pythonから来ているC++の初心者として、なぜC++が(グローバル名前空間内の)関数外のコードを許可しないのか分かりません。これは、main()が呼び出される前に、あるいは他の関数が宣言される前に初期化を行うと便利なようです。 (私はコンパイラで議論しようとしているわけではありませんが、私はちょうどこのように実装する思考プロセスを知りたいと思います)。なぜ関数内にC++コードを含める必要がありますか?

+0

機能がない場合、そのようなコードはどのように実行されますか? –

+0

「main」の前にコードを実行して、面倒なグローバルコードを伴わない方法もあります。 – chris

+1

そんなに役に立たないようです。 –

答えて

12

Pythonプログラムを実行しているとき、インタプリタは上から順に実行されます下に行くと実行します。 C++では、それは起こりません。コンパイラは、すべての関数を小さな機械語コードに組み込み、リンカがそれをフックします。実行時に、オペレーティングシステムはmain関数を呼び出し、そこからすべてが実行されます。そのコンテキストでは、関数の外のコードは無意味です - いつ実行されますか?

+0

この回答は、私がC++で学習したことを多少光栄に思うという重要なアイデアで多くの助けになりました。それはコンパイルされた言語であるということです。 –

+0

私はこれもCのケースだと思っていますか? –

+0

はい、Cと同じです。 –

1

main()はプログラムへのアクセスポイントです。だから、あなたが書いて欲しいコードは、その時点から実行命令を出す必要があります。

静的変数はmain()が実行される前に開始されるため、それ以前に必要な変数をすべて開始することができます。

しかし、プログラムの状態を開始する実行コードが必要な場合は、プログラムの先頭で実行し、静的変数を乱用してコンストラクタを実行する必要があります。

3

これは、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()関数で登録されています。

関連する問題