3

有点学术问题,但我在编写一些单元测试时遇到了这个问题。

我的单元测试框架 (UnitTest++) 允许您创建结构以用作固定装置。通常这些是为文件中的测试定制的,所以我把它们放在我的单元测试文件的顶部。

//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(最高警告级别)并且没有出现警告。我想这是名称冲突,为什么要发明命名空间,但我真的需要将每个单元测试装置包装在单独的命名空间中吗?我只是想确保我没有遗漏一些更基本的东西。

有没有更好的方法来解决这个问题 - 这应该发生吗?我不应该看到重复符号错误或其他什么吗?

4

3 回答 3

8

尝试将类粘贴在匿名命名空间中,您可能会发现它比必须为每个文件创建和命名新命名空间更令人讨厌。

无权访问 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)
{
 ...
}
于 2010-01-15T22:09:59.923 回答
2

编译器一次只能在一个编译单元上工作;这将是源文件及其#includes 的任何内容。由于您的课程位于不同的文件中,因此没有冲突。

链接器将所有内容放在一起,但它不知道类定义,因此也看不到冲突。

回到 C 的时代,链接器很常见地识别出您有两个同名的不同函数并生成错误消息。使用 C++ 中的内联函数和模板,它不能再这样做了 - 不同的编译单元通常会包含相同函数的重复项,因此链接器只是假设它们是相同的。

于 2010-01-15T22:11:27.433 回答
0

这基本上是由于需要在头文件中定义类这一事实的结果,这导致在每个目标文件中都有类的冗余定义。因此,可以处理 C++ 链接的链接器必须将多余的类声明折叠在一起,并假装该类只声明了一次。

链接器无法区分包含在多个对象中的单个类和多个对象中具有相同名称的多个类。

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

于 2010-01-15T22:11:15.110 回答