编译单元和静态链接问题

时间:2011-09-08 17:29:34

标签: c++ compilation

我将完全改写这个问题,因为我没有得到我正在寻找的解决方案(他们很有帮助,但他们没有说出我引用的其他问题没有说的任何内容)。

鉴于以下4个文件:

文件#1:A.h

class A { void a_func(); };

文件#2:A.cpp

#include "A.h"

static int x = 4;

void A::a_func() {
    //implementation.
}

文件#3:B.h

#include "A.h"
class B { void b_func(); };

文件#4:B.cpp

#include "B.h"

static int x = 3;

void B::b_func() {
    //implementation.
}

问题#1:由于B.h包括A.h,A.cpp是否是B编译单元的一部分?

问题2:自A.cpp和B.cpp都声明了静态变量(x)的相同名称后会出现错误吗?我听说静态全局变量具有依赖于翻译单元的静态链接,但由于我不知道问题#1,这对我没什么帮助。

3 个答案:

答案 0 :(得分:3)

  • 翻译单元包含预处理器发出的所有内容。在gcc中,尝试使用g++ -E myfile.cpp来查看它是什么。

  • 静态全局变量具有静态链接,因此它们的名称不会溢出到TU之外。在每个单独的TU中,静态全局(无论是否相同名称)将是一个单独的对象,仅在该TU本地。

答案 1 :(得分:0)

回答#1:绝对不是

回答#2:完全没问题。尝试,你会自己看到它

答案 2 :(得分:0)

“编译单元”是一个独立的源代码块,可以自行编译。每个.cpp文件与其包含的.h文件组合时是一个编译单元。所以a.cpp和a.h的组合是一个编译单元,b.cpp和b.h以及a.h是另一个编译单元。

由于b.cpp不包含a.cpp,因此与每个都具有相同名称的静态变量没有冲突。