0

1000 行を超えるコードのプロジェクトをコンパイルする最良の方法について疑問に思っていました。プロジェクトをコンパイルする最良の方法について、基本的な質問がいくつかあります。違いがある場合は、GCCを使用しています。私の質問は次のとおりです。

  • ライブラリを複数のソース ファイルに含めると、関数が 2 回コピーされますか?

つまり、次のような 2 つのファイルがあるとします。

ソース.c

#include<stdio.h>
...
void static test_func( ){ printf( "Hey!" ); }

Source2.c

#include<stdio.h>
...
void static test_func( ){ printf( "Hey!" ); }

関数 printf は、実行可能ファイルに 2 回コピーされますか? 多くの場合、同じヘッダーファイルを共有する複数のソースファイルがあり、それが悪い習慣であるかどうか疑問に思っているため、これを避けたいと考えています。

ある時、これを使って他のソースファイルをインクルードしました:

Source.c

#include<stdio.h>
#include "source2.c"

しかし、それも悪い習慣なのかどうかはわかりませんでした。それは私を別の質問に導きます:

  • ソースファイルを含めることは悪い習慣ですか?

注: 悪い習慣とは、何かが慣習に反しているか、ある種の非効率性を引き起こしていることを意味します。

編集:ライブラリがファイル間で共有されていることを読みました。つまり、私の最初の質問に対する答えはノーです。ただし、プリプロセッサを使用してソース ファイルをインクルードすることが一般的な方法であるかどうかに興味があります。

4

3 に答える 3

1

ライブラリ関数は、静的リンケージ中に 1 回だけ組み込まれます。ライブラリが動的である場合、コピーはまったく追加されず、動的リンク情報のみが追加されます。

.c特別な理由がない限り、ファイルを含めるのは奇妙です。そのような理由の 1 つは、モジュール内の関数をまったく必要としない外部モジュール テストmainプログラムの場合ですが、同時にそれを適切にテストするために、mainすべてのファイル静的データにアクセスする必要があり、アクセスできませんでした。別のファイルからアクセスできます。

于 2013-04-25T19:56:59.440 に答える
1

ファイル間でライブラリを複数回含めても、最終的な実行可能ファイルに複数回含まれることはありません

リンカーは関数を解決する責任があり、関数を既に認識しており、既に含まれていることがわかった場合、静的リンクに再度含めることは試みません。また、リンカーは、含まれている必要なファイルのみが含まれていることを確認します静的リンクの特定の定義。

動的リンクでは、リンカーは実行時にアプリケーションが必要とする動的ライブラリ ファイルをメモリに読み込みます。

于 2013-04-25T19:57:12.620 に答える