【发布时间】:2020-08-02 21:42:58
【问题描述】:
我是 C 编程新手,我对头文件包含部分有疑问。
(1) 我知道按照惯例,头文件不应包含函数定义。但是在这个简单的代码中:
#include<stdio.h>
int main(){
printf("123");
}
printf 函数在stdio.h 中声明,但是我没有手动定义printf 函数。为什么代码编译成功?它不应该抛出类似function printf is not defined的编译错误吗?
(2)假设我有一个foo.h的头文件,它声明了函数foo
int foo(int num);
我在foo.h 的同一目录下有一个main.c 文件:
#include <stdio.h>
#include "foo.h"
int main(){
printf("%d",foo(123));
}
我的问题是我应该在哪里定义函数foo?除了main.c里面还有别的地方吗?
如果不是,那么使用头文件有什么意义?因为在我看来,这就像:每次我们要实现在头文件中声明的函数时,都必须在.c 文件中定义它。
为什么不直接在main.c 中定义(并因此声明)函数foo?
【问题讨论】:
-
Function
foo()由编译器和链接器在 make 进程告知的位置找到,具体机制因编译器和环境而异。类似地,链接器被告知或已经知道在哪里可以找到标准库函数printf()。头文件中的声明是为了让调用代码正确地接口函数。 -
在
foo.h中声明foo()后,我在foo.c中定义了foo(),我的IDE(或者应该说是链接器?)成功发现:foo()定义在@987654344中@ 编译主程序时。然后我将定义文件foo.c重命名为bar.c,我的IDE 找不到定义并抛出错误。我是否应该始终将定义.c文件命名为与声明头文件相同?
标签: c compilation