【发布时间】:2021-11-14 13:03:38
【问题描述】:
当您有多个 C 文件时,比如 main.c 和 process.c,我试图了解两种情况下在函数之外声明的变量的存储位置。
// this is main.c
#include <stdio.h>
#include "process.h"
int foo = 1;
void main() {
int count = get_counter();
}
// this is process.c
#include <stdio.h>
int counter = 0;
int get_counter() {
return counter;
{
所以当你有两个c文件,你的main.c和一个process.c,你可以在中调用get_counter() em>main.c 它将返回 process.c 文件中的值。我想了解的是编译器在哪里,或者它如何将 int foo 存储在 main.c 和 int count 在 process .c?这是某些数据存储部分的一部分吗?它不在堆栈上吗?它似乎也有一个单独的 process.c 文件,因此它不是全局变量。
我一直在努力了解变量作用域是如何处理的,这对我来说可能有点棘手。 #include "process.h" 本质上是否像在其余代码上方的 main.c 中具有函数及其原型一样进行编译?对我来说,这会使 int 计数器 全局化,所以我知道我有些混淆了。
感谢您抽出宝贵时间阅读本文。
【问题讨论】:
-
它存储在每个目标文件的 DATA 部分中。
-
当链接器组合目标文件时,它会连接它们的所有数据部分,并修复变量引用以在其中的适当部分找到它们。
-
为什么你认为它不是全局变量?每个源文件都有自己的一组全局变量。
-
我使用的术语可能不正确。相对于 main.c,process.c 不是全局的。我需要 process.c 中的 get_counter() 来检索该参数。不确定代码如何分隔每个 c 代码都有自己的全局变量的数据段?
-
由于
process.c中的counter是全局的,所以在main.c中你可以作弊,说extern int counter;,然后直接说int count = counter;,而不使用访问器函数。要将counter变量设为process.c的私有变量,并禁止main.c以这种方式作弊,您可以将其声明更改为static int counter;。
标签: c variables scope compiler-construction