0

これは翻訳で少し失われているので、より正確に言うと、recursion.c、fib.c、および countUp.c というクラスがあります。recursion.c から、入力引数によって決定される fib.c または countUp.c を再帰的に呼び出す必要があります。ヘッダー ファイルを使用できず、プロトタイプを配置する必要があるだけです。

int fib(int n);

void countUp(int n);

私のメイクファイル

TAR = tar
COMPILER_FLAGS = -g -Wall -std=c99 -c
LINKER_FLAGS = -g -o
OBJS = recurse.o
C_FILES = recurse.c fib.c countUp.c
ASM_FILES = recurse.asm
TARGET_FILE = recurse
TARGET_TAR = PA5.tar

$(TARGET_TAR): $(TARGET_FILE)
    $(TAR) -cvf $(TARGET_TAR) $(C_FILES) $(ASM_FILES) $(TARGET_FILE) Makefi$

recurse.o: recurse.c
    $(C_COMPILER) $(COMPILER_FLAGS) $(C_FILES)

$(TARGET_FILE): $(OBJS)
    $(LD_LINKER) $(LINKER_FLAGS) $(TARGET_FILE) $(OBJS)

ここで、fib および countUp クラス メソッドは再帰的に呼び出す必要があります。recursive.c ファイルは、c ドライバーと見なされます。標準の c ヘッダー (stdio.h、string.h など) 以外のヘッダー ファイルを作成または実装しないでください。これを実行しようとすると、次のようになります。

make
gcc -g -o recurse recurse.o
recurse.o: In function `main':
(file root location)/recurse.c:43: undefined reference to `fib'
(file root location)/recurse.c:46: undefined reference to `countUp'
collect2: ld returned 1 exit status
make: *** [recurse] Error 1

何が起こっているのか手がかり。

元の質問: 実行可能ファイルに結合する C ファイルが複数あります。たとえば、math.c があるとします。引数がそれに渡され、入力引数が add を呼び出すと、add.c から関数が実行され、引数が減算を呼び出すと、subtract.c から関数が呼び出されます。次に、.o ファイルにコンパイルされ、実行可能ファイルが作成されます。私が抱えている問題は、ヘッダー (.h) ファイルを利用できないことです。別々のクラスに侵入する方法はありますか、それとも何か不足していますか? 私は本当に質問をする方法を正確に知りません.専門用語はCに関する限りかなり悪いです.申し訳ありません:(

ドライバーのイメージがよくわかりません。(デバイス ドライバーではありません。彼女は、これは ac 実行可能ドライバーであると私たちに言い続けています)。

4

3 に答える 3

2

私の理解が正しければ、 で定義した関数の上に次のプロトタイプを追加する必要があると思いますrecursion.c。プロトタイプを使用すると、内部の任意の関数内からこれらの関数を呼び出すことができますrecursion.c (実際、ヘッダー ファイルを含めることは、@Justin と @EdS が既に指摘したように、ファイルで定義されたすべてのプロトタイプをコピーして貼り付けることに似ています)。

int fib(int n);
void countUp(int n);

int main() {
 ...
}

次に、プロジェクト ファイルにファイル recursion.c、fib.c、および countUp.c が含まれていることを確認する必要があります 。プロジェクトをビルドすると、リンカーがジョブを実行し、コンパイルされたオブジェクト ファイルのエントリ ポイントを検索します。単一の実行可能ファイルのアセンブルに進みます。

どのコンパイラを使用していますか?

于 2012-10-25T19:24:23.550 に答える
1

ヘッダー ファイルのインクルードは、そのファイルの内容をインクルードの場所にインクルードするための単なるプリプロセッサ ディレクティブです。ヘッダー ファイルを使用せずに同じことを行うには、ヘッダー ファイルに配置するコードをコピーして、各 c ファイルの先頭に貼り付けます。

もちろん、コンテンツを変更したい場合は多くのファイルで変更する必要があるため、これはあまり保守的ではありません。したがって、そもそもヘッダーファイルが存在する理由です。

于 2012-10-25T18:56:11.933 に答える
0

これは宿題なので、A) 使用するヘッダー ファイルがなく、B) キーワードを使用するように指示されていないという事実を考慮するとextern、唯一の選択肢は . c ファイル自体:

#include "add.c"
#include "subtract.c"
/* etc... */

int main()
{
    // use functions defined in "add.c", "subtract.c", etc.
}

インターフェイスの代わりに実装を含めており、不要または必要のないものをたくさん引き込んでいる可能性があるため、これは悪い形式であることに注意してください。それがあなたの質問に答えていない場合は、質問に欠けている何か、先生からの指示があります.

于 2012-10-25T18:54:59.433 に答える