C 不同翻译单元的记忆表示

C 不同翻译单元的记忆表示,c,C,不同的翻译单位在记忆中是如何表现的 例如 //InternalLinkage.h static int var = 10; //File A.h void UpdateStaticA(); //File A.cpp #include "InternalLinkage.h" void UpdateStaticA() { var = 20; } //File B.h void UpdateStaticB(); //File B.cpp #include "InternalLinkage.

不同的翻译单位在记忆中是如何表现的

例如

//InternalLinkage.h
static int var = 10;

//File A.h
void UpdateStaticA();

//File A.cpp
#include "InternalLinkage.h"
void UpdateStaticA()
{
  var = 20;
}

//File B.h
void UpdateStaticB();

//File B.cpp
#include "InternalLinkage.h"
void UpdateStaticB()
{
    var = 30;
}

//main.cpp
#include "InternalLinkage.h"
#include "ClassA.h"
#include "ClassB.h"
int _tmain(int argc, _TCHAR* argv[])
{
    UpdateStaticA();
    UpdateStaticB();
    printf("var = %d",var);
}
这里的输出是10,因为我们知道我们有三个翻译单元,每个单元都有自己的静态变量var的副本

  • 这些翻译单位是如何保存在内存中的
  • 内存中每个翻译单元都有单独的部分,这样编译器就可以为每个翻译单元维护静态变量“Var”了吗

  • 显然,内存中有变量“var”的三个不同副本,那么编译器如何维护哪个副本属于哪个翻译单元?

    您所说的“翻译单元”是什么意思?只有一个变量“var”。由于它是全局初始化数据,编译器将把它放入数据部分。不确定你到底在问什么。所谓翻译单位,我指的是一个文件(.c/.cpp),包括了上面所示示例中的所有头文件,B.cpp和main.cpp可以被视为三个不同的翻译单元,因为它们都包含“InternalLinkage.h”,它们都有一个静态变量“var”的副本,该变量具有定义它的翻译单元的范围。每个翻译单元将被编译成一个单独的对象文件,每个文件都有不同的符号表。在每个符号表中都有一个“var”条目。当对象链接在一起时,将在最终可执行文件中创建一个带有两个不同“var”项的符号表。两个或三个副本?我认为应该有三个条目。