TL; DR
查资料得知 extern 关键字是变量在其他文件的声明。突然感觉很奇怪,那如果文件 A,在头文件中定义了某一个变量,文件 B 不使用 extern 不也是可以使用的吗?为什么还要用 extern 这个关键字呢?
结论:
- 使用 extern 可以使用在其他文件定义(.c)的变量,即使这个文件没有在头文件中定义。
- 假设只有两个文件 a.c b.c,在 b.c 中 include a.h,a 文件和 b 文件会共用 include 中的变量。
- 如果要使用其他文件定义的变量,尽量使用 extern,这样也很明了。
extern 的用法
在 ext 目录下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ➜ ext cat a.c int foo_a = 10; ➜ ext cat b.c #include<stdio.h>
extern int foo_a;
int main() { printf("%d ", foo_a); return 0; } ➜ ext gcc a.c b.c -o p ➜ ext ./p 10
|
没啥问题,b.c 中 extern 声明了一个在其他文件定义的变量。然后打印出来 10。
不使用 extern 但是在头文件中定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| ➜ ext cat a.h int foo_a; int get_foo_a(); ➜ ext cat a.c int foo_a = 10;
int get_foo_a() { return foo_a; } ➜ ext cat b.c #include<stdio.h> #include "a.h"
int main() { printf("%d\n", foo_a); foo_a = 100; printf("%d\n", get_foo_a()); return 0; } ➜ ext gcc a.c b.c -o p ➜ ext ./p 10 100
|
虽然没有使用 extern,但是 a.c 和 b.c 使用的 foo_a 地址都是一样的。这说明使用 include 的也能使用其他位置定义的变量。
不使用 extern 在头文件中也没有定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ➜ ext cat a.c int foo_a = 10; ➜ ext cat b.c #include<stdio.h>
int main() { printf("%d\n", foo_a); return 0; } ➜ ext gcc a.c b.c -o p b.c:4:20: error: use of undeclared identifier 'foo_a' printf("%d\n", foo_a); ^ 1 error generated.
|
这样编译不过。
参考