在C语言中,extern
关键字主要用于声明一个变量或函数是在其他文件或代码块中定义的,但在这里可以被引用。它告诉编译器该变量或函数是在其他地方定义的,因此编译器不会在当前的代码块中查找其定义。
变量声明
当你想在多个源文件之间共享一个全局变量时,通常会在一个源文件中定义该变量,并在其他源文件中使用 extern
关键字声明它。
定义(在一个源文件中):
// file1.c | |
int global_var = 10; |
声明(在其他源文件中):
// file2.c | |
extern int global_var; | |
void some_function() { | |
printf("%d\n", global_var); // 访问在file1.c中定义的global_var | |
} |
函数声明
对于函数,extern
通常不是必需的,因为函数默认就是全局可见的(只要它们在文件作用域内声明)。但是,有时为了明确性,或者当你包含了一个不声明所有函数的头文件时,你可能会看到 extern
用于函数声明。
定义(在一个源文件中):
// file1.c | |
void my_function() { | |
// ... 函数体 ... | |
} |
声明(在头文件中,通常不需要extern,但为了明确性):
// my_functions.h | |
extern void my_function(); |
使用(在其他源文件中):
// file2.c | |
#include "my_functions.h" | |
void another_function() { | |
my_function(); // 调用在file1.c中定义的my_function | |
} |
注意:虽然在这个例子中 extern
对于函数声明是可选的,但在某些情况下,例如当你不直接包含定义函数的源文件或库时,它可能是必要的。
静态(Static)与外部(Extern)
static
关键字用于限制变量的可见性和链接性。在文件作用域内,static
变量只在定义它的源文件中可见。extern
用于声明在其他地方定义的变量或函数。
两者在作用域和链接性上有显著的区别。