首先我们区分两个 术语
所以其作用可以解释为
int foo(int arg1, char arg2);
被编译器视为
extern int foo(int arg1, char arg2);
编译器认为在程序的某一位置,该函数有所定义,因此不会报错,而会使用该声明继续编译
区分 声明 和 定义
// 仅声明
extern int var;
// 定义
int var;
// 声明必须显式地带上extern关键字,否则会混淆定义和声明,声明时不分配内存
代码分析
编译通过,var在全局定义
int var;
int main(void) {
var = 10;
return 0;
}
编译通过,var在全局声明,虽然没有其他位置定义,但并未使用
extern int var;
int main(void) {
return 0;
}
编译不通过,var在全局声明,而且试图修改值,但并未定义,故在链接时会报错
extern int var;
int main(void) {
var = 10;
return 0;
}
如果在其他文件定义var,则上述情况没有问题
#include "somefile.h"
// #pragma once
// int var;
extern int var;
int main(void) {
var = 10;
return 0;
}
以下代码,视为全局定义var (分配内存),因此编译通过
extern int var = 0;
int main(void) {
var = 10;
return 0;
}
原文:https://www.cnblogs.com/jamgun/p/14779151.html