将程序构建为库时处理静态函数

时间:2018-12-16 20:05:36

标签: c unit-testing static-libraries static-functions

为实现我的一个程序的单元测试,我添加了一个makefile规则,以在运行“ make check”时将程序构建为静态库。我用 #ifndef TEST_LIB #endif TEST_LIB 作为库构建时已定义)包装main()。

然后我创建了一些小的C文件来测试该库中的某些功能。

库中的某些函数是静态声明的。

当我尝试编译测试时,您可能会猜出这样的警告:

  

/../ test / config_test.c:15:3:警告:函数“ realize_home”的隐式声明[-Wimplicit-function-declaration]

因为 realize_home 是在程序的源代码(.c文件)中静态声明的。

我尝试的一种解决方案是#include config_rmw.c(包含静态函数)到.c单元文件(config_test)中。即使config_rmw.c已内置在库中,该命令实际上仍然有效,并且在编译时不会给我任何警告。

我想到的另一种解决方案是

#ifndef TEST_LIB
static
#endif
void function()
{
    definition
}

并将原型添加到标头中,即#ifdef语句。

#ifdef TEST_LIB
function prototype
#endif

但是这样做并不完全正确,尤其是当我继续实施更多的单元测试时,如果必须对更多的功能执行此操作。

我最近在书中读到,静态函数应该放在头文件中。我尝试过,但是只能部分解决我的问题。我结束了像这样的编译器警告:

  

在../../src/rmw.c:38:0包含的文件中:   ../../src/config_rmw.h:86:1:警告:“ realize_home”已定义但未使用[-Wunused-function]    实现_首页(char ** str)    ^ ~~~~~~~~~~~

我读了一些书,我有点理解为什么会这样。从根本上讲,这意味着我将在每个.c文件中单独包含该函数的副本,该文件包含定义的头文件。我不需要我之所以静态声明一些函数,是因为它们仅在一个文件中需要。

然后,我读到一些评论,其中一些人说不应在头文件中定义静态函数!

所以...我一直在想最好的方法和其他选择。我更喜欢组织程序并练习良好的编码技能。

我仅使用基于脚本的方法编写了一些测试,这不需要将我的程序构建为库,但是我认为使用这两种方法都将具有优势,这取决于所测试的功能。

更新(添加)。该程序有20个源文件(包括头文件)和约4K行代码。

1 个答案:

答案 0 :(得分:0)

我将按照建议here

我认为#include .c文件适合测试。如果由于某种原因引起麻烦,则pan64建议的“包装函数”方法应该是可以接受的折衷方案。

static void realize_home(char **)
{
    implementation
}
#ifdef UNITTEST
void test_realize_home(char **v)
{
    realize_home(v);
}
#endif