14

私はいくつかの.cファイルを持っています、すなわち実装ファイルは言う

  • main.c
  • 交流
  • 紀元前

任意のファイルの関数が別のファイルの任意の関数を呼び出すことができる場合。私の質問は、.hAとBの実装ごとにieヘッダーファイルが必要ですか。各ヘッダーファイルには、AまたはBのすべての関数の定義があります。

また、main.cにはとの両方A.hが含まB.h #includedれますか?

誰かが最終的にそれを明らかにすることができたら、また、後でターミナルで複数のファイルをコンパイルして実行するにはどうすればよいですか?

ありがとう。

4

4 に答える 4

25

ヘッダーの内容

のヘッダーA.hA.cは、で定義された機能を使用する外部コードに必要な情報のみを含める必要がありますA.c。静的関数を宣言するべきではありません。静的変数を宣言するべきではありません。内部型(でのみ使用される型)を宣言するべきではありませんA.c。ファイルがちょうど使用できることを確認してから、#include "A.h"によって公開された機能を最大限に活用する必要がありA.cます。自己完結型でべき等であり(コンパイルエラーなしで2回含めることができるように)、最小限である必要があります。#include "A.h"の最初の#include行として書き込むことで、ヘッダーが自己完結型であることを簡単に確認できます。A.c; 2回含めることで、べき等であることを確認できます(ただし、別のテストとして実行することをお勧めします)。コンパイルされない場合は、自己完結型ではありません。同様にB.hB.c

ヘッダーと標準の詳細については、「ヘッダーで使用する必要があり#includeますか? 」を参照してください。'はNASAのコーディング標準を参照し、'静的ライブラリに対するリンクchkhdr'には、自己完結性とべき等性をテストするために使用するスクリプトが含まれています。

リンク

、、およびにmain.o依存しますが、それ自体はヘッダーに依存しないことに注意してください。main.cA.hB.hmain.c

コンパイルに関しては、次を使用できます。

gcc -o program main.c A.c B.c

他のオプションが必要な場合は、それらを追加します(最初にほとんどのフラグ、最後にライブラリ、ソースコードの後に​​)。各ファイルを個別にオブジェクトコードにコンパイルしてから、オブジェクトファイルをリンクすることもできます。

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o program main.o A.o B.o
于 2013-03-25T18:51:43.553 に答える
4

.cファイルで宣言されているものが別のファイルで必要な場合は、ヘッダーファイルを提供する必要があり.cます。

一般的に言えば、宣言されたすべての関数またはexternシンボルをエクスポートするすべてのソースファイルのヘッダーファイルを持つことができます。

実際には、すべての関数またはすべての変数をエクスポートする必要はなく、別のソースファイルで必要なものだけをエクスポートし、必要なファイル(および特定のヘッダーファイルとペアになっているソース)に含める必要があります。 )。

それがどのように機能するかを理解しようとするときは、すべてのソースファイルが独自にコンパイルされるという事実を考えてください。したがって、ソースファイルで直接宣言されていないものを使用する場合は、ヘッダーファイルを介して宣言する必要があります。このようにして、コンパイラーはすべてが存在し、正しく入力されていることを知ることができます。

于 2013-03-25T18:51:05.963 に答える
4

コンパイラによって異なりますが、gccを使用していると仮定すると、次のようなものを使用できます。

gcc -Wall main.c A.c B.c -o myoutput

詳細については、http://www.network-theory.co.uk/docs/gccintro/gccintro_11.html(最初のGoogleの回答)を参照してください。複数のオブジェクトファイル/ライブラリにコンパイルできます。

gcc -c main.c
gcc -c A.c
gcc -c B.c
gcc -o mybin main.o A.o B.o
于 2013-03-25T18:52:19.607 に答える
1

使いたい

gcc -g *.c -lm

入力を節約し、プロジェクト内のすべてのcファイルをリンクできるようになります。

于 2020-08-14T05:21:52.063 に答える