的有点学术问题,但我就遇到了这个,而写一些单元测试。

我的单元测试框架(单元测试++)允许创建结构以用作夹具。通常这些定制文件中的测试,所以我把他们在我的单元测试文件的顶部。

//Tests1.cpp

struct MyFixture {  MyFixture() { ... do some setup things ...} };

TEST_FIXTURE(MyFixture, SomeTest)
{
  ...
} 

//Tests2.cpp

struct MyFixture { MyFixture() { ... do some other setup things, different from Tests1}};

 TEST_FIXTURE(MyFixture, SomeOtherTest)
 {
  ...
 }

不过,我发现最近(与VS2005至少),当你名称中使用相同的名称(所以现在具有相同的名称存在于结构的两个版本),然后将灯具结构的的版本之一是悄无声息抛出即可。这是非常令人惊讶的,因为我有我的编译器设置为/ W4(最高级别的警告),并没有警告出来。我想这是一个名称冲突,以及为什么命名空间被发明了,但我真的需要每个包裹我的单元测试夹具在不同的命名空间?我只是想确保我不缺少的东西更重要。

有没有更好的办法来解决这个问题 - 这应该是这样吗?我不应该会看到一个重复的符号错误的东西?

有帮助吗?

解决方案

尝试在一个匿名的命名空间粘贴类,你会发现它不必创建并命名为每个文件新的命名空间少没意思。

别存取VS2005和.cpp的单元,但是这可能工作..

//Tests1.cpp
namespace
{
struct MyFixture {  MyFixture() { ... do some setup things ...} };
}

TEST_FIXTURE(MyFixture, SomeTest)
{
  ...
} 


//Tests2.cpp
namespace
{
struct MyFixture { MyFixture() { ... do some other setup things, different from Tests1}};
}

TEST_FIXTURE(MyFixture, SomeOtherTest)
{
 ...
}

其他提示

编译器只能在一个时间的单个编译单元上;这将是源文件和任何它来#include。由于您的类在不同的文件,没有冲突存在。

链接器把一切融合在一起,但它不知道类的定义所以也没有看到任何冲突

早在C的天,这是很常见的链接器识别您有两个不同的功能具有相同的名称,并产生错误消息。在C ++内联函数和模板,它不能再这样了 - 不同的编译单元通常会包含相同功能的重复,因此链接只是假定它们是相同的。

这基本上是一个事实,即类需要在头文件,这导致具有在每个对象文件中的类的定义,冗余被定义的结果。因此,可以处理C ++联动接头具有折叠冗余类的声明一起,假装类被声明一次。

这里没有任何方式的连接体来区分之间的单个类包括到多个对象和多个类与多个对象相同的名称。

您必须使用命名空间(或更好的语言),来解决这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top