Pythonから来たc++の初心者として、なぜc ++が関数の外部(グローバル名前空間内)のコードを許可しないのかわかりません。これは、main()が呼び出される前、または他の関数が宣言される前に、初期化を行うと便利なようです。(私はコンパイラーと議論しようとはしていません。この方法でコンパイラーを実装する背後にある思考プロセスを知りたいだけです。)
3 に答える
When you're running a python program, the interpreter runs through it from top to bottom executing as it goes. In C++, that doesn't happen. The compiler builds all your functions into little blobs of machine code and then the linker hooks them up. At runtime, the operating system calls your main
function, and everything goes on from there. In that context, code outside of functions is meaningless - when would it run?
これは、C++とPythonのスタイルの違いと考えることができます。ただし、それにはかなりの理由があります。CおよびC++では、コードの実行が開始される非常に明確で具体的な場所があり、それがmain()
関数の始まりです(もちろん、これは真実の近似にすぎませんが、今のところ無視できます。 )実際、C / C ++プログラムはmain()
、プログラムが実際に何をするのかを理解したいときに、私の意見では非常に役立つ関数で開始および終了します。プログラムのハイレベルな流れはより明確です。これを別の方法と比較してください。コードがファイル全体に散在し、関数とその他の間に散在しています。
よく整理された重要なPythonプログラムでも、コードの本体を下に置きますif __name__ == "__main__":
ね。
さて、もう少し進んだものについて。main()
関数が呼び出される前にコードを実行する方法があります。それらの1つは次のとおりです。
#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()
ます。
main()は、プログラムへのアクセスポイントです。したがって、記述したいコードは、その時点から実行順序を持つ必要があります。
静的変数はmain()が実行される前に開始されるため、その前に必要な変数を開始できます。
ただし、プログラムの状態を開始するコードを実行する場合は、プログラムの最初で実行し、静的変数を悪用してコンストラクターを実行する必要があります。