7

我在网上和我的教科书里都看过,这让我很困惑。

假设您在 stack.c 中有一些用于堆栈的函数,并将它们的原型放在 stack.h 中。例如,您的主程序 test.c#include "stack.h"位于顶部。这就是所有示例的显示方式。

所以它包含了原型,但是它是如何得到它们的实现的呢?头文件似乎不需要您#include stack.c使用它们。它只是搜索同一文件夹中的所有 .c 文件并尝试找到它们吗?

4

5 回答 5

9

不; 它只包括标题。

您单独编译源代码,并将其与使用它的代码链接。

例如(玩具代码):

堆栈.h

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

堆栈.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");
}

测试.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 回答