7

私は教科書だけでなくオンラインでも見回しましたが、これは私を混乱させます。

stack.cにスタック用の関数がいくつかあり、それらのプロトタイプをstack.hに配置するとします。たとえば、メインプログラムのtest.cが#include "stack.h"一番上にあります。これは、すべての例が示す方法です。

それで、それはプロトタイプを含みます、しかしそれはどのようにそれらの実装を得るのですか?ヘッダーファイルは、あなたがそれらを持っていることを要求していないようです#include stack.c。同じフォルダ内のすべての.cファイルを検索して、それらを見つけようとしますか?

4

5 に答える 5

9

いいえ; ヘッダーのみが含まれます。

ソースを個別にコンパイルし、それを使用するコードにリンクします。

例(おもちゃのコード):

stack.h

extern int pop(void);
extern void push(int value);

stack.c

#include "stack.h"
#include <stdio.h>
#include <stdlib.h>

enum { MAX_STACK = 20 };
static int stack[MAX_STACK];
static int stkptr = 0;

static void err_exit(const char *str)
{
     fprintf(stderr, "%s\n", str);
     exit(1);
}

int pop(void)
{
    if (stkptr > 0)
        return stack[--stkptr];
    else
        err_exit("Pop on empty stack");
}

int push(int value)
{
    if (stkptr < MAX_STACK)
        stack[stkptr++] = value;
    else
        err_exit("Stack overflow");
}

test.c

#include <stdio.h>
#include "stack.h"

int main(void)
{
    for (int i = 0; i < 10; i++)
        push(i * 10);

    for (int i = 0; i < 10; i++)
        printf("Popped %d\n", pop());
    return(0);
}

コンパイル

c99 -c stack.c
c99 -c test.c
c99 -o test_stack test.o stack.o

または:

c99 -o test_stack test.c stack.c

したがって、ソースファイルをコンパイルして(オプションでオブジェクトファイルを生成し)、それらをリンクします。多くの場合、stack.oファイルは(標準Cライブラリ以外の)ライブラリに配置され、そのライブラリにリンクします。もちろん、これは標準Cライブラリ関数でも起こります。Cコンパイラは、Cライブラリ(通常は-lc)をリンクコマンドに自動的に追加します。

于 2012-04-09T01:30:30.190 に答える
1

ヘッダーは、プロトタイプを取得するためにのみ必要です。実装は個別にコンパイルされ、完成したライブラリまたはリンカーによって実行可能ファイルにアセンブルされます。

于 2012-04-09T01:31:26.430 に答える
0

ヘッダーファイル(*.h)は、コンパイラをサポートするためだけにあります。個々のソースファイルは、リンカーを介して一緒に含まれています。基本的なC開発の教科書ならどれでもこれをカバーするはずですが、まともな「チュートリアル」のようなものがあります。

http://www.tenouk.com/ModuleW.html

于 2012-04-09T01:31:29.827 に答える
0

test.cをコンパイルし、 test.oを生成し、stack.cをコンパイルしてstack.oを生成し、ある段階で.oファイルをリンクして完全なプログラムを生成する必要があります。

于 2012-04-09T01:31:42.110 に答える
0

いいえ。.cファイルをコンパイルしてリンクする必要があります。

于 2012-04-09T01:47:31.710 に答える