在C中包含头文件时,它是否会自动包含同名的.c文件?

时间:2012-04-09 01:28:56

标签: c header

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

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

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

5 个答案:

答案 0 :(得分: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)添加到链接命令。

答案 1 :(得分:1)

只需获取原型即可获得标题。实现是单独编译的,并由linker组装成完成的库或可执行文件。

答案 2 :(得分:0)

头文件(*.h)只是为了支持编译器。各个源文件通过链接器包含在一起。任何基本的C开发教科书都应该涵盖这一点,但是有一个不错的“教程”:

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

答案 3 :(得分:0)

必须编译test.c,生成test.o,编译stack.c生成stack.o,并在某个阶段链接.o文件以生成一个完整的程序。

答案 4 :(得分:0)

没有。您应该编译并链接.c文件。