如果我有两个struct
具有相同的名称,但是每个///////////////////////////////
// test1.h
class Foo
{
public :
void bar();
};
///////////////////////////////
// test2.h
class Foo2
{
public:
void bar();
};
///////////////////////////////
// test1.cpp
#include "test1.h"
struct Test
{
Test() :a(0){}
int a;
};
void Foo::bar()
{
Test t;
}
///////////////////////////////
// test2.cpp
#include "test2.h"
struct Test
{
Test() :a(0), b(0){}
int a, b;
};
void Foo2::bar()
{
Test t;
}
///////////////////////////////
// main.cpp
#include "test1.h"
#include "test2.h"
int main()
{
Foo2 f;
f.bar();
}
都写入了它自己的.cpp文件中,它是否真的是未定义的行为?
{{1}}
我已将此作为错误here报告给Microsoft,但他们回答说,这是未定义的。 是真的吗?这对我来说很奇怪。
答案 0 :(得分:3)
这确实给出了未定义的行为。 “一个定义规则”的一部分规定,如果在多个翻译单元中定义具有外部链接的同一个类,则定义必须相同。 (规则的确切措辞相当冗长,所以我不会引用它;如果你想要血淋淋的细节,请参阅C ++ 11 3.2 / 5)。通过在两个翻译单元中以不同方式定义Test
,您可以破坏此规则。
避免类似名称冲突的最简单方法是将一个文件的本地定义放在一个未命名的命名空间中:
namespace {
struct Test {
// whatever
};
}