为什么全局变量由另一个源文件中的类初始化

Why do global variable get initialized by class in another source file?

本文关键字:初始化 源文件 全局变量 另一个 为什么      更新时间:2023-10-16

例如,我有两个源,每个源中都有一个类和一个静态函数。类、函数和全局变量的名称相同:(我添加的功能只是为了比较。)

//A.cpp
#include <stdio.h>
static bool FooFunc() { printf("Hello from function in A!n"); return true; }
class FooClass
{
public:
    FooClass() { printf("Hello from class in A!nn"); }
};
static bool fooFunc = FooFunc();
static FooClass fooClass;

//B.cpp
#include <stdio.h>
static bool FooFunc() { printf("Hello from function in B!n"); return true; }
class FooClass
{
public:
    FooClass() { printf("Hello from class in B!nn"); }
};
static bool fooFunc = FooFunc();
static FooClass fooClass;

结果:

Hello from function in A!
Hello from class in A!
Hello from function in B!
Hello from class in A!

"B.cpp"中的类是否以某种方式被忽略?若是这样,编译器不应该给我一些错误或警告吗?我试过"g++"answers"clang"编译器,行为相同。

在c++中,source文件被称为翻译单元(在预处理器之后)。在编译每个单元之后,object文件(.o)然后通过链接器链接在一起。现在,每个类在链接时都有一个唯一的标识符(因此它可以与其他翻译单元放在一起,以解析变量等)。源文件具有相同的类名,从而违反了一个定义规则。所以,你有两个选择。第一个是重命名两个类中的一个,第二个是将它们放在namespace下。希望我能帮上忙。