C extern 关键字
在 C 语言中,使用 extern 关键字声明的变量是外部变量,表示该变量在别处(通常是其他文件)定义。
extern 关键字在 C 语言中用于声明外部变量或函数,使得它们可以在多个文件中共享和使用。
extern 主要用于实现模块化编程和代码的分离。
extern 变量的声明和定义通常放在不同的文件中。
extern 变量
下面演示如何在一个文件中定义外部变量,并在另一个文件中声明和使用它。
1、定义和初始化(在一个文件中 file1.c)
实例
#include <stdio.h>
// 定义并初始化外部变量
int d = 3;
int f = 5;
void printExternVariables() {
printf("d: %d, f: %d\n", d, f);
}
// 定义并初始化外部变量
int d = 3;
int f = 5;
void printExternVariables() {
printf("d: %d, f: %d\n", d, f);
}
2、声明并使用(在另一个文件中 file2.c)
实例
#include <stdio.h>
// 声明外部变量
extern int d;
extern int f;
// 声明外部函数(必须在调用之前声明)
extern void printExternVariables();
int main() {
// 使用外部变量
printf("d in main: %d\n", d);
printf("f in main: %d\n", f);
// 调用其他文件中定义的函数
printExternVariables();
return 0;
}
// 声明外部变量
extern int d;
extern int f;
// 声明外部函数(必须在调用之前声明)
extern void printExternVariables();
int main() {
// 使用外部变量
printf("d in main: %d\n", d);
printf("f in main: %d\n", f);
// 调用其他文件中定义的函数
printExternVariables();
return 0;
}
将 file1.c 和 file2.c 一起编译并运行(编译命令见下文),输出结果为:
d in main: 3 f in main: 5 d: 3, f: 5
extern 函数
类似于变量,函数也可以在一个文件中定义,在另一个文件中声明并使用。
1、定义函数(在一个文件中 file1.c)
实例
#include <stdio.h>
void printMessage() {
printf("Hello from printMessage!\n");
}
void printMessage() {
printf("Hello from printMessage!\n");
}
2、声明并使用函数(在另一个文件中 file2.c)
实例
#include <stdio.h>
// 声明外部函数
extern void printMessage();
int main() {
// 调用外部函数
printMessage();
return 0;
}
// 声明外部函数
extern void printMessage();
int main() {
// 调用外部函数
printMessage();
return 0;
}
3、编译多个文件
为了使用 extern 变量和函数,必须将所有相关文件一起编译。例如:
gcc file1.c file2.c -o program ./program
上面的函数示例编译运行后,输出结果为:
Hello from printMessage!
注意事项
使用 extern 时需要注意以下几点:
| 注意点 | 说明 |
|---|---|
| 定义和初始化 | 外部变量必须在一个文件中定义和初始化,而在其他文件中仅声明,extern 声明不能进行初始化。 |
| 作用域 | extern 变量和函数具有全局作用域,可以在程序的任何地方访问。 |
| 重复定义 | 避免在多个文件中重复定义相同的变量或函数,这会导致链接错误。 |
| 头文件使用 | 通常将 extern 声明放在头文件中,然后在需要的源文件中包含该头文件。 |
头文件的使用
为了简化管理,可以使用头文件声明 extern 变量和函数。
variables.h 文件代码:
#ifndef VARIABLES_H
#define VARIABLES_H
// 声明外部变量
extern int d;
extern int f;
#endif
#define VARIABLES_H
// 声明外部变量
extern int d;
extern int f;
#endif
functions.h 文件代码:
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
// 声明外部函数
void printExternVariables();
void printMessage();
#endif
#define FUNCTIONS_H
// 声明外部函数
void printExternVariables();
void printMessage();
#endif
然后在源文件中包含头文件:
file1.c 文件代码:
#include <stdio.h>
#include "variables.h"
#include "functions.h"
// 定义并初始化外部变量
int d = 3;
int f = 5;
void printExternVariables() {
printf("d: %d, f: %d\n", d, f);
}
void printMessage() {
printf("Hello from printMessage!\n");
}
#include "variables.h"
#include "functions.h"
// 定义并初始化外部变量
int d = 3;
int f = 5;
void printExternVariables() {
printf("d: %d, f: %d\n", d, f);
}
void printMessage() {
printf("Hello from printMessage!\n");
}
file2.c 文件代码:
#include <stdio.h>
#include "variables.h"
#include "functions.h"
int main() {
// 使用外部变量
printf("d in main: %d\n", d);
printf("f in main: %d\n", f);
// 调用外部函数
printExternVariables();
printMessage();
return 0;
}
#include "variables.h"
#include "functions.h"
int main() {
// 使用外部变量
printf("d in main: %d\n", d);
printf("f in main: %d\n", f);
// 调用外部函数
printExternVariables();
printMessage();
return 0;
}
同样使用 gcc file1.c file2.c -o program 编译运行,输出结果为:
d in main: 3 f in main: 5 d: 3, f: 5 Hello from printMessage!
这样通过头文件管理 extern 声明,代码更加清晰和易于维护。

C 变量