为什么全局变量在另一个源文件中被类初始化?

时间:2015-11-29 18:43:49

标签: c++ class global-variables

例如,我有2个源,每个源都有一个类和一个静态函数。 类,函数和全局变量都具有相同的名称: (我添加了仅用于比较的函数..)

//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!\n\n"); }
};

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!\n\n"); }
};

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 ++'和'clang'编译器,行为相同。

1 个答案:

答案 0 :(得分:1)

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