使用C 中的链接seam break static变量依赖关系
Break static variable dependency using Link Seam in C++
我正在尝试为功能编写单元测试。此功能是静态的,在文件中,例如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
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- "static initialization order fiasco"是 constexpr 变量的问题吗?
- 使用C 中的链接seam break static变量依赖关系
- 成员变量在 C++17 中标记为'static' static_assert?
- GCC 仍然使用 -fno-threadsafe-static 生成保护变量
- 如果变量在 .h 文件中定义为"static "怎么办?
- "static const char array"可以在 C 语言上包含变量成员吗
- 带有static/const的变量,在本例中使用
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- const/static关键字是否在变量声明中传播
- 在没有实例变量的情况下初始化派生类中的"inherited static members"
- 返回静态变量时,static const与static的区别
- 为什么使用static、extern和不使用static声明的变量包含不同的值
- 如果我们在c++中使用static关键字删除[-Wreturn local-addr](警告:返回本地变量的地址),可以
- "static"关键字与类的变量、函数和对象等有什么用?