这是一篇关于 extern
关键字踩坑的记录笔记。
有时候我们希望调用外部文件中定义的函数,通常我们会使用头文件引用来实现这一功能,不过这也同时导致头文件中的其他成员也能够被调用,降低了安全性。所以在这里我们使用 extern
来引用外部函数。
extern
原本是用于声明的关键字,它用于告诉编译器我们将要使用的变量(或常量或函数等)的类型和标识符,而它的定义则需要在下文出现(所谓先声明再定义再调用)。
当然,在这里,我们将函数的定义放在另一个文件中:
int f(int a, int b) {
return a + b;
}
上面的代码展示的是整个脚本的内容(不再有上下文),我们假定这个文件是 a.c
接下来我们编写包含对它的调用的脚本 b.c:
#include<stdio.h>
extern int f(int, int);
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d", f(a, b));
return 0;
}
在这个脚本中,我们用 extern
关键字对函数 int f(int, int)
进行了声明。这里,我们无需写出参数列表中每个参数的标识符,它们甚至都不会在这一步分配内存,因为这是对它的声明而不是定义,它只用于告诉编译器 “这个未定义的家伙你以后就认识了。”
那么,编译器何从得知这个 int f(int, int)
的定义在何处呢?
只要在编译时,在编译指令里同时传入这两个文件即可:
gcc a.c b.c -o b.exe
这样得到的 b.exe 就是正常的解决 A+B Problem 的可执行程序了。
当然这里 extern
后面跟的函数的标识符、返回值类型、参数类型都应该与 a.c 中定义的函数一致(规则和函数重载的判定类似)。