2011-09-08 57 views
2

因为我没有完全找到我正在寻找的解决方案,所以我会彻底改写这个问题(他们很有帮助,但他们没有说任何其他我引用的问题,说吧)。编译单元和静态链接问题

鉴于以下4个文件:

文件#1:阿

class A { void a_func(); }; 

文件#2:A.cpp

#include "A.h" 

static int x = 4; 

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

文件#3:BH

#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)的同名后,会不会有错误?我听说静态全局变量具有静态链接,这是依赖于翻译单元的,但是因为我不知道第一个问题,所以这对我没有多大帮助。

回答

3
  • 翻译单元包含来自预处理器的所有内容。在gcc中,试试g++ -E myfile.cpp看看是什么。

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

0

答案#1:绝对不是

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

0

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

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