6

から

あるファイルで C 関数を定義し、それを別のファイルから呼び出すにはどうすればよいですか?

filefunc1.cで関数を定義し、それを file から呼び出したいとしますcall.c。どうすればこれを達成できますか?

そして答え

関数の宣言をファイルに入れfunc1.h、 を追加 #include "func1.h"call.cます。次に、コンパイルまたはリンクfunc1.c してcall.c一緒にします (詳細はどの C システムによって異なります)。

私の質問は、ヘッダー ファイルの名前は のよう func1.hに で<name-of-c-file>.hある必要がありますか、それともこれは単なるベスト プラクティスですか? 可能であれば参照用のリンクを提供してください。

4

2 に答える 2

5

ではc、ファイルに名前を付ける必要はまったくありません。そのため、ヘッダー mylongheadername.hを呼び出しながら、ソース ファイルを呼び出して、a.cその中に という関数を含めることができますjustArandomFunctionName

ただし、ソース ファイルにはヘッダー ファイルを含める必要があることに注意してください。通常、ヘッダーとソース ファイルの間には強い関連性があるため、ほぼ常にこの方法で行われます。ただし、以下は完全に有効です。

a.c : func1 implementation
      func2 implementation

b.c : func3 implementation
      func4 implementation

c.h : func1 declaration
      func3 declaration

d.h : func2 declaration
      func4 declaration

ただし、この方法には、このように設定されたファイルを使用するときに発生する可能性のある問題がいくつかあります (つまり、これらのファイルを正しく構造化するために余分な作業を行う必要があります)。ただし、ヘッダー ファイルの使用方法は単なる慣例であり、言語によって強制されるものはほとんどありません。


次に、関数が定義されている場所をヘッダー ファイルが認識していない場合、これがどのように機能するかという問題があります。これの考え方は、知る必要がないということです。

基本的に、ヘッダーが行うことは、特定のプロファイル (名前、パラメーター、戻り値の型) に適合する関数をどこかで定義したことをコンパイラに伝えることだけです。コンパイラがこれを読み取ると、基本的には、このすべての情報を派手な名前に混ぜて、呼び出しているファイルに挿入するだけです。つまり、何もしません。次に実行する必要がある手順は、リンカーを使用して、各ファイルのコンパイル済みバージョンを単一の実行可能ファイルに変換することです。これは多くのことを行いますが、最も重要なことの 1 つは、コンパイラが作成した凝った名前をすべて解決することです。ただし、リンカーがこれを行う方法は、ファイルのすべてのコンパイル済みバージョンを読み取り、関数の定義を他のコードの実際の場所に一致させることです。

于 2012-10-23T01:06:37.223 に答える
2

いいえ、ヘッダー ファイルは、対応する C ソース ファイルと一致する必要はありません。おっしゃる通りただの慣習です。

于 2012-10-23T01:04:08.703 に答える