9

我的项目包含 C 文件。在某些文件中,我将函数定义为静态。

我在单元测试中使用 CppUnit,我想测试这些静态函数。我知道不允许从文件外部(定义它的地方)调用函数。为了从我的 C++ 测试文件中调用这些静态函数,是否有避免此问题的解决方案?

4

3 回答 3

6

假设我们谈论的是 C 静态函数,那么最简单的解决方案是在编译调试版本时使函数非静态。这意味着您可以在单元测试中使用这些符号。这仅在没有符号别名的情况下才有效。

如果您DEBUG在所有调试版本上定义符号,则类似于:

#ifdef DEBUG
#define debug_export 
#else
#define debug_export static
#endif

然后像这样定义你的静态函数

debug_export void foo(void)
{
...
}

并且要么有条件地在头文件中包含声明,要么在您的单元测试文件中手动导入它们:

extern void foo(void);

解决它的其他方法是将单元测试包含在源文件本身中(如果它失控会有点混乱),而不是对函数进行单元测试(有点逃避)或标记函数作为 dll-local而不是静态的,并确保您的单元测试是该动态对象的一部分。

于 2013-04-16T16:24:36.523 回答
4

我有一个通用头文件,我包含在我项目的所有源文件中。我添加了这些行,问题就解决了:

#ifdef TEST
#define static
#endif

我什至可以避免在我的原始 C 代码中添加上述代码。我可以在 gcc 命令中添加标志-Dstatic=,我发现这也有效。

但是我们在使用这个解决方案时必须小心,因为:

  • 我们可以在 2 个单独的文件中将相同的变量/函数名称定义为静态。
  • 我们可以有一个包含定义为静态变量的函数。
于 2013-04-17T15:41:23.990 回答
1

有没有办法重构代码以消除对静态方法的需求?从 OO 设计的角度来看,静态是羊皮中的全局变量。

我知道这不一定是实际或最快的答案,但您可以通过消除它来改进您的设计。

于 2013-04-17T19:28:15.447 回答