.h 文件中声明的函数在哪里找到其定义?

o_y*_*eah 6 c compilation

我是 C 编程新手,对头文件包含部分有疑问。

(1) 我知道按照惯例,头文件不应包含函数定义。但在这个简单的代码中:

#include<stdio.h>
int main(){
    printf("123");
}
Run Code Online (Sandbox Code Playgroud)

printf函数在 中声明stdio.h,但是我没有手动定义该printf函数。为什么代码可以编译成功?它不应该抛出类似的编译错误吗function printf is not defined

(2) 假设我有一个foo.h头文件,其中声明了函数foo

int foo(int num);
Run Code Online (Sandbox Code Playgroud)

main.c我在同一目录中有一个以下文件foo.h

#include <stdio.h>
#include "foo.h"
int main(){
    printf("%d",foo(123));
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我应该在哪里定义函数foo?除了里面还有别的地方吗main.c

如果不是,那么使用头文件有什么意义呢?因为在我看来,就像:每次我们想要实现在头文件中声明的函数时,我们都必须在文件中定义它.cfoo为什么不直接在, 中定义(并声明)函数main.c

dbu*_*ush 2

头文件的主要目的是声明一个模块中定义的函数和变量,以便在另一个不相关的模块中使用。

在第二个示例中,您可以使用以下内容创建 foo.c:

int foo(int num)
{
    return num * 4;
}
Run Code Online (Sandbox Code Playgroud)

然后你将编译 foo.c 和 main.c:

gcc -c foo.c
gcc -c main.c
Run Code Online (Sandbox Code Playgroud)

然后链接它们:

gcc -o my_program foo.o main.o
Run Code Online (Sandbox Code Playgroud)

foo如果您尝试仅编译和链接 main.c,则会收到链接器错误,指出无法找到的定义。

当您有一个大型项目时,您通常希望将函数分解为多个文件,并将相关函数放在一个 .c 文件中。

对于 stdio.h 中声明的函数,它们是标准 C 库的一部分。这些函数的定义会自动链接,因此您不必显式地这样做。