在C语言中,extern
关键字用于声明变量或函数的外部链接性,表明其定义位于其他文件或同一文件的其他位置。以下是其核心用法和注意事项:
作用与意义
- 跨文件共享:允许在多个源文件之间共享全局变量或函数。
- 声明与定义分离:避免重复定义,确保变量/函数仅在单一位置定义,其他位置通过声明引用。
基本用法
1. 跨文件访问全局变量
-
定义变量(仅一次,不带
extern
):// file1.c int globalVar = 10; // 实际定义,分配内存
-
声明变量(其他文件使用
extern
):// file2.c extern int globalVar; // 声明,告诉编译器变量在其他文件定义
2. 跨文件访问函数
- 函数默认具有外部链接性,声明时可省略
extern
:// file1.c void func() { ... } // 定义函数 // file2.c extern void func(); // 等效于 void func();
3. 同一文件内提前声明
- 若全局变量定义在文件末尾,可通过
extern
提前声明:extern int x; // 声明x将在后面定义 void foo() { x = 5; } int x = 10; // 实际定义
注意事项
-
禁止初始化:
extern
声明不能初始化变量,否则变为定义:extern int x = 5; // 错误!会导致重复定义
- 正确做法:定义时初始化,声明时不初始化。
-
避免重复定义:
- 若多个文件直接定义同名全局变量(无
extern
),链接时会报错。 - 正确做法:仅在一个文件中定义,其他文件用
extern
声明。
- 若多个文件直接定义同名全局变量(无
-
头文件中的使用:
- 在头文件中声明全局变量为
extern
,源文件中定义:// common.h extern int sharedVar; // common.c int sharedVar = 100;
- 包含该头文件的代码均可通过
sharedVar
访问同一变量。
- 在头文件中声明全局变量为
示例场景
// file1.c
int globalVar = 10; // 定义全局变量
void func() { globalVar++; }
// file2.c
#include <stdio.h>
extern int globalVar; // 声明外部变量
extern void func(); // 声明外部函数
int main() {
func();
printf("%d\n", globalVar); // 输出11
return 0;
}
总结
- 变量:用
extern
声明外部全局变量,定义时无需extern
。 - 函数:默认外部链接,
extern
可省略。 - 核心作用:实现跨文件数据共享,确保单一定义原则(One Definition Rule, ODR)。