这几天看代码时遇到个比较小白的函数调用问题,这里记录一下。
一 函数调用
下面列举一下c语言函数调用的2种写法。
常规写法
假如我们有个main.c文件,main()函数位于其中,main()函数里调用了func(),而func()是在module.c里定义的。通常我们会写个module.h,然后在这个点h文件里对func()进行声明,最后main.c里include这个module.h,这样main()函数就可以正常调用func()了。
main.c如下
#include <stdio.h>
#include "module.h" // key
int main(void)
{
func();
printf("hello world\n");
return 0;
}
module.h如下,
#ifndef _MODULE_H_
void func(void);
#endif
module.c如下,
#include <stdio.h>
void func(void)
{
printf("Now is inside %s().\n", __func__);
}
没有头文件的写法
另外一种写法是不使用头文件,只要main.c和module.c。其写法如下,
main.c如下,
#include <stdio.h>
extern void func(void); // 直接声明所需要的函数
int main(void)
{
func();
printf("hello world\n");
return 0;
}
module.c和上面的一样,没有变化,
#include <stdio.h>
void func(void)
{
printf("Now is inside %s().\n", __func__);
}
二 解释
C语言支持分离编译。对于上节常规写法,我们在生成可执行文件时,是按照下面这个步骤做的
- gcc -c main.c -o main.o
- gcc -c module.c -o module.o
- gcc -o main main.o module.o
对于第一步,gcc会在main.c里会把#include "module.h"
替换为module.h里的内容,这一步基本等价于上节的第二种写法(没有头文件)。
所以没有头文件的写法也可以达到相同效果,只是不规范。如果module.c里定义了很多函数且main()里都要用,或者其它模块里的函数也要调用module.c里定义的函数,那么上述没有头文件的写法就显得比较臃肿了。