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