C语言中使用Extern 使用别的文件中的全局变量的编译器原理是啥
时间: 2024-03-04 09:52:07 浏览: 61
当在一个 C 语言程序中使用 `extern` 关键字声明一个全局变量时,编译器会在符号表中记录这个变量的名称和类型,并在编译时为其分配一个临时的地址。这个地址并不是真正的内存地址,而是一个在编译器内部使用的地址,用于表示这个变量的存储位置。
在链接阶段,链接器会将符号表中所有 `extern` 声明的符号与其他目标文件中的定义进行匹配,以确定它们实际的存储地址。如果找到了匹配的定义,链接器会将其地址填充到之前编译时为该变量分配的临时地址中。最终,程序中的所有引用都将指向同一个全局变量实例。
这个过程中,编译器和链接器需要按照一定的规则对符号进行命名和解析。在不同的操作系统和编译器中,这些规则可能略有不同,但是它们通常都遵循某种标准的命名约定和符号表格式。
总的来说,使用 `extern` 声明全局变量的编译器原理是通过在符号表中记录变量的名称和类型,然后在链接时将其与其他目标文件中的定义进行匹配,最终确定变量的实际存储地址。
相关问题
extern修饰全局变量C语言
extern是C语言中用来声明全局变量或函数的关键字。它的作用是告诉编译器该变量或函数是在其他文件中定义的,而不是当前文件中定义的。
当我们在一个文件中使用extern修饰全局变量时,它表示该变量在其他文件中已经定义了。这样,在编译时,编译器会在其他文件中查找该变量的定义,并将其链接到当前文件中。
使用extern修饰全局变量的语法如下:
extern 数据类型 变量名;
例如,我们在文件A.c中定义了一个全局变量num:
int num;
如果我们在文件B.c中想要使用这个全局变量,可以在B.c中使用extern关键字进行声明:
extern int num;
这样,编译器就知道num是在其他文件中定义的全局变量,并会将其链接到B.c中。
需要注意的是,extern关键字只是用来声明全局变量或函数,并不会为其分配内存空间。实际的内存分配是在定义该变量或函数的文件中进行的。
c语言中的extern
在C语言中,关键字"extern"用于声明一个全局变量或函数,表示该变量或函数是在其他文件中定义的。它的作用是告诉编译器该变量或函数的定义将在其他文件中找到,而不是当前文件中。
通过使用extern关键字,我们可以在一个文件中声明一个全局变量或函数,并在其他文件中使用它们。这样可以将变量或函数的定义分散到多个文件中,提高了代码的模块化和可维护性。
具体而言,extern关键字用于以下两个场景:
1. 在一个文件中声明一个全局变量,然后在其他文件中使用该变量:
```c
// 在一个文件中声明全局变量
extern int globalVariable;
// 在另一个文件中使用该全局变量
int main() {
printf("%d\n", globalVariable);
return 0;
}
```
这样,编译器在编译第二个文件时将会知道globalVariable是一个在其他地方定义的全局变量。
2. 在一个文件中声明一个函数,然后在其他文件中调用该函数:
```c
// 在一个文件中声明函数的原型
extern void myFunction();
// 在另一个文件中调用该函数
int main() {
myFunction();
return 0;
}
```
这样,编译器在编译第二个文件时将会知道myFunction是一个在其他地方定义的函数。
需要注意的是,extern关键字只是用于声明变量或函数,而不是定义变量或函数。变量或函数的定义通常在其他文件中进行。
阅读全文