首页 > 编程笔记

C语言extern关键字

在 C语言中,extern 是一种关键字,它用于在一个源文件中引用另一个源文件中定义的全局变量或函数。

当使用 extern 关键字声明一个变量时,该变量并不会被定义,而是告诉编译器这个变量在其他地方已经定义好了。例如,我们可以在一个源文件中定义一个全局变量,然后在其他的源文件中使用该变量,而不必重新定义一遍。简单来说就是,extern 可以告诉编译器某个变量已经在其他源文件中定义过了。

下面我们来看一个例子:

在源文件 a.c 中定义一个全局变量:
// a.c
#include <stdio.h>
int a = 10;
在源文件 b.c 中使用这个全局变量:
// b.c
#include <stdio.h>
extern int a; // 声明变量 a 已在其他源文件中定义
int main() {
    printf("a = %d\n", a);
    return 0;
}
注意到在 b.c 中使用了 extern 关键字声明了变量 a,告诉编译器这个变量已经在其他源文件中定义过了。然后我们就可以在 main 函数中使用变量 a 了。当编译 b.c 文件时,编译器会查找其他源文件中是否有定义变量 a,如果找到了就会将其引入。

需要注意的是,使用 extern 声明的变量或函数只是告诉编译器这个变量或函数已经在其他源文件中定义过了,但是并不会在当前文件中分配内存。因此,在其他源文件中定义的变量或函数必须要有一个实际的定义,否则链接时会出现找不到符号的错误。

下面我们再来看一个例子:

在源文件 a.c 中定义一个全局变量:
// a.c
#include <stdio.h>
int a = 10;
在源文件 b.c 中使用这个全局变量,但没有在 a.c 中定义:
// b.c
#include <stdio.h>
extern int a; // 声明变量 a 已在其他源文件中定义
int main() {
    printf("a = %d\n", a);
    return 0;
}
如果我们直接编译 b.c 文件,则会出现链接时找不到符号 a 的错误:

$ gcc b.c -o b
/tmp/ccOXYGcX.o: In function `main':
b.c:(.text+0xa): undefined reference to `a'
collect2: error: ld returned 1 exit status

因为虽然我们在 b.c 中使用了 extern 声明了变量 a,但是在其他源文件中并没有定义过这个变量,因此编译器找不到 a 的定义。

总之,extern 关键字可以用于在一个源文件中引用另一个源文件中定义的全局变量或函数。通过使用 extern 声明变量或函数已经在其他源文件中定义过了,我们可以在当前源文件中使用这些变量。

推荐阅读