使用C 中的链接seam break static变量依赖关系

Break static variable dependency using Link Seam in C++

本文关键字:static 变量 依赖 关系 break seam 链接 使用      更新时间:2023-10-16

我正在尝试为功能编写单元测试。此功能是静态的,在文件中,例如filea.cpp,尽管它不是任何类的成员。

在filea.cpp中,还有一个静态变量。在另一个文件中say fileb.cpp中有此静态变量的用法。

我现有的单元测试代码未参考filea.cpp,因为到目前为止均未对其功能进行测试。但是,它确实测试了fileb.cpp的功能。为了促进此静态变量参考,在单元测试项目的main.cpp中定义了一个假变量(我正在使用Googletest框架(。

,但是现在我需要测试filea.cpp。当我在makefile中添加文件时,我会为此静态变量遇到"多个定义"错误。

我尝试在生产和测试项目中分别引入一个.h文件(例如globalvars.h(,并将变量移动到那里,但似乎并没有愚弄编译器。测试项目中的filea.cpp实例仍在尝试访问生产代码的globalvars.h,我再次获得了双重定义。

有什么想法我该如何打破这种依赖性?

而不是静态变量,您应该使用匿名名称空间内定义的变量。这些可以用作静态全局变量将在翻译单元中,但是它们具有在翻译单元之外不可见的优势,而不是打破一个定义规则。

// a.cpp
static int count = 0;
void f() { ++count; }
// b.cpp
static int count = 100; // breaks ODR
int g() { return count--; }

变成

// a.cpp
namespace { int count = 0; }
void f() { ++count; }
// b.cpp
namespace { int count = 100; } // OK
int g() { return count--; }

进一步阅读:

  • 未命名/匿名名称空间与静态功能-Stackoverflow.com
  • 名称空间-cppreference.com