私の「プログラマーではない」友人の1人が最近、複雑な機械的問題を解決するC++プログラムを作成することを決めました。
彼は各関数を個別の.cppファイルに記述し、次のようにそれらをすべてメインのソースファイルに含めました。
main.cpp:
#include "function1.cpp"
#include "function2.cpp"
...
int main()
{
...
}
次に、コードをコンパイル、gccの1行を使用します。
g++ main.cpp // took about 2 seconds
さて、これでうまくいくことはわかっていますが、.cppファイルをメインプログラムに直接インクルードすることが良いアイデアかどうかはわかりません。次のスキームを何度か見ましたが、すべての関数プロトタイプは、次のように、externキーワードを使用してヘッダーファイルに入ります。
funcs.h:
extern void function1(..);
extern void function2(..);
...
main.cpp:
...
#include "funcs.h"
...
&コンパイル:
g++ -c function1.cpp
g++ -c function2.cpp
...
g++ -c main.cpp
g++ -o final main.o function1.o function2.o ...
この方法の方が良いと思います(Makefileを使用するのはもちろんです)。友達に彼を説得するのにどのような理由がありますか?
オブジェクトごとにオブジェクトをコンパイルする主な理由は、時間を節約するためです。高レベルのローカライズされたコードの変更では、多くの場合、1つのオブジェクトのコンパイルと再リンクのみが必要です。 (ヘッダーのヒープに描画するオブジェクトが多すぎたり、同じテンプレートを重複してインスタンス化したりすると、一般的なコードの変更により完全な再コンパイルがトリガーされると、実際には遅くなる可能性があります)。
プロジェクトが2秒でコンパイルできるほど小さい場合、従来のアプローチには実際のメリットはあまりありませんが、期待されていることを実行すると、開発者の時間を節約できます。バランスを取るには、メイクファイルの保守にも時間がかかりますが、インクルードディレクトリ、ライブラリ、コンパイラスイッチなどを簡単にキャプチャするために、とにかくそうすることになるでしょう。
記述/生成されたコードへの実際の影響:
ところで、C++では、ヘッダーはextern
キーワードを明示的に使用せずに関数を宣言できますが、それは通常のことです。
2番目のスタイルの理由は、各.cppファイルを、独自のクラス、グローバル変数などを使用して、競合のリスクなしに個別に処理できるためです。
すべての.cppファイル(MSVCなど)を自動的にリンクするIDEの方が簡単です。