例如,我有两个源,每个源中都有一个类和一个静态函数。类、函数和全局变量的名称相同:(我添加的功能只是为了比较。)
//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++"one_answers"clang"编译器,行为相同。
在c++中,source
文件被称为翻译单元(在预处理器之后)。在编译每个单元之后,object
文件(.o)然后通过链接器链接在一起。现在,每个类在链接时都有一个唯一的标识符(因此它可以与其他翻译单元放在一起,以解析变量等)。源文件具有相同的类名,从而违反了一个定义规则。所以,你有两个选择。第一个是重命名两个类中的一个,第二个是将它们放在namespace
下。希望我能帮上忙。