C++ 编译单元与静态链接问题

C++ 编译单元与静态链接问题,c++,compilation,C++,Compilation,我将完全改写这个问题,因为我不太明白我想要的解决方案(它们很有帮助,但它们没有说任何东西,而我提到的其他问题没有说) 给定以下4个文件: 文件#1:A.h 文件#2:A.cpp 文件#3:B.h 文件#4:B.cpp 问题#1:既然B.h包括A.h,那么A.cpp是B的编译单元的一部分吗 问题#2:由于A.cpp和B.cpp都声明了静态变量(x)的相同名称,是否会出现错误?我听说静态全局变量有静态链接,这取决于翻译单元,但由于我不知道问题1,这对我帮助不大。 翻译单元由来自预处理器的所有内容组成

我将完全改写这个问题,因为我不太明白我想要的解决方案(它们很有帮助,但它们没有说任何东西,而我提到的其他问题没有说)

给定以下4个文件:

文件#1:A.h

文件#2:A.cpp

文件#3:B.h

文件#4:B.cpp

问题#1:既然B.h包括A.h,那么A.cpp是B的编译单元的一部分吗

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

  • 翻译单元由来自预处理器的所有内容组成。在gcc中,尝试
    g++-emyfile.cpp
    查看这是什么

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

回答#1:绝对不是

回答2:没问题。试试看,你会自己看到的。

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

由于b.cpp不包括a.cpp,因此在每个中使用同名的静态变量并不冲突

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

static int x = 4;

void A::a_func() {
    //implementation.
}
#include "A.h"
class B { void b_func(); };
#include "B.h"

static int x = 3;

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