在C语言中,extern
关键字用于声明一个变量或函数是在其他地方定义的,而不是在当前文件中。它告诉编译器,变量的定义或函数的实现在其他地方,这样编译器就不会在当前编译单元中查找它们的定义。这样做的好处是可以将一个大型程序分割成多个源文件,每个源文件可以单独编译,最后链接成一个可执行文件。
extern
关键字通常用于以下两种情况:
-
变量声明:当你想要在一个文件中使用另一个文件中定义的变量时,你可以在使用的文件中使用
extern
来声明这个变量。 -
函数声明:虽然在现代C编程中,通常我们直接使用函数原型来声明函数,但在某些情况下,
extern
也可以用于声明函数,尤其是在混合使用C和其他语言(如C++或汇编)时。
变量声明
假设我们有两个源文件,file1.c
和file2.c
,以及一个头文件common.h
。
common.h
#ifndef COMMON_H | |
#define COMMON_H | |
extern int globalVar; // 声明全局变量,定义在另一个文件中 | |
#endif // COMMON_H |
file1.c
#include "common.h" | |
#include <stdio.h> | |
int main() { | |
printf("The value of globalVar is: %d\n", globalVar); | |
return 0; | |
} |
file2.c
#include "common.h" | |
int globalVar = 42; // 定义全局变量 |
在这个例子中,globalVar
在file2.c
中定义并初始化。在file1.c
中,我们通过包含common.h
头文件来声明这个变量,这样编译器就知道globalVar
是一个在其他地方定义的全局变量。
函数声明
虽然在现代C编程中,我们更习惯于直接在头文件中使用函数原型来声明函数,但extern
也可以用于此目的,特别是在需要明确表明函数是在其他地方定义的情况下。
common.h
#ifndef COMMON_H | |
#define COMMON_H | |
extern void printHello(); // 声明函数,定义在另一个文件中 | |
#endif // COMMON_H |
file1.c
#include "common.h" | |
int main() { | |
printHello(); // 调用在另一个文件中定义的函数 | |
return 0; | |
} |
file2.c
#include <stdio.h> | |
#include "common.h" | |
void printHello() { // 定义函数 | |
printf("Hello, World!\n"); | |
} |
在这个例子中,printHello
函数在file2.c
中定义。在file1.c
中,我们通过包含common.h
头文件来声明这个函数,表明这个函数是在其他地方定义的。这样,当链接器链接所有的编译单元时,它会找到printHello
函数的定义,并将其与main
函数中的调用关联起来。
总的来说,extern
关键字在C语言中用于声明变量或函数是在其他编译单元中定义的,这允许程序员将程序分割成多个文件,每个文件可以单独编译和链接。