C语言中使用Extern 使用别的文件中的全局变量的编译器原理是啥
时间: 2024-03-04 07:52:07 浏览: 65
当在一个 C 语言程序中使用 `extern` 关键字声明一个全局变量时,编译器会在符号表中记录这个变量的名称和类型,并在编译时为其分配一个临时的地址。这个地址并不是真正的内存地址,而是一个在编译器内部使用的地址,用于表示这个变量的存储位置。
在链接阶段,链接器会将符号表中所有 `extern` 声明的符号与其他目标文件中的定义进行匹配,以确定它们实际的存储地址。如果找到了匹配的定义,链接器会将其地址填充到之前编译时为该变量分配的临时地址中。最终,程序中的所有引用都将指向同一个全局变量实例。
这个过程中,编译器和链接器需要按照一定的规则对符号进行命名和解析。在不同的操作系统和编译器中,这些规则可能略有不同,但是它们通常都遵循某种标准的命名约定和符号表格式。
总的来说,使用 `extern` 声明全局变量的编译器原理是通过在符号表中记录变量的名称和类型,然后在链接时将其与其他目标文件中的定义进行匹配,最终确定变量的实际存储地址。
相关问题
C语言中头文件使用extern声明全局变量
在C语言中,当你需要在多个源文件中访问同一种类型的全局变量时,可以使用`extern`关键字来声明该变量。`extern`的作用不是定义变量,而是告诉编译器这个变量已经在其他地方定义过了。具体步骤如下:
1. 在某个源文件(通常称为"头文件",扩展名为`.h`)中,声明全局变量并使用`extern`:
```c
// example.h
extern int globalVariable;
```
这行代码表示在当前头文件中有一个全局整型变量`globalVariable`,但是并没有实际的初始化。
2. 在另一个源文件(通常包含函数实现的部分)中,首次定义变量:
```c
// example.c
#include "example.h"
int globalVariable = 0; // 实际定义变量并给它赋值
// 或者在一个单独的文件里只负责初始化:
int globalVariableInitializer();
int globalVariableInitializer() {
return 0;
}
int main() {
extern int globalVariable; // 如果不在定义变量的地方引用,也需要extern
globalVariable = globalVariableInitializer();
return 0;
}
```
这样,无论`main`函数在哪个源文件中,`globalVariable`都能被正确地识别和使用,因为它的存在已经被声明并且在某个地方进行了初始化。
extern修饰全局变量C语言
extern是C语言中用来声明全局变量或函数的关键字。它的作用是告诉编译器该变量或函数是在其他文件中定义的,而不是当前文件中定义的。
当我们在一个文件中使用extern修饰全局变量时,它表示该变量在其他文件中已经定义了。这样,在编译时,编译器会在其他文件中查找该变量的定义,并将其链接到当前文件中。
使用extern修饰全局变量的语法如下:
extern 数据类型 变量名;
例如,我们在文件A.c中定义了一个全局变量num:
int num;
如果我们在文件B.c中想要使用这个全局变量,可以在B.c中使用extern关键字进行声明:
extern int num;
这样,编译器就知道num是在其他文件中定义的全局变量,并会将其链接到B.c中。
需要注意的是,extern关键字只是用来声明全局变量或函数,并不会为其分配内存空间。实际的内存分配是在定义该变量或函数的文件中进行的。
阅读全文