我有一个没有测试的C库A
,我正在尝试为它的一个函数funC
:添加测试
在funC
中未在A/lib.h
中声明,仅在A/lib.c
:中声明
static int funC();
static int funC(){
// do something
}
我在test/A.t.cpp
中创建了一个测试文件,想访问funC进行测试。funC只在.c文件中声明,所以我决定使用extern C
。在test/A.t.cpp
中,我有:
extern "C"{
static int funC();
}
TEST(A,test){
funC();
.....
}
我认为通过.t.cpp文件中的声明,它将能够链接到.c文件中的实际实现,因此我应该能够调用该函数并对其进行测试,但我得到了:
Error: The function funC() has not had a body defined
我该怎么修?然后,我还尝试在测试文件中添加实现,它成功了,但这不是我想要的。我希望.t.cpp文件链接到.c文件中的实际实现。谢谢
函数funC()
具有内部链接(这是static
对C中函数和文件范围变量的含义(。无论是C还是C++,都不能从定义它的翻译单元以外的其他翻译单元按名称调用它。
在您的测试源中,相同的名称指代不同的函数,但您尚未为其提供定义。
如果您希望funC()
可以从单独的测试文件中调用,那么您应该通过删除其static
限定符或将其更改为extern
来将其更改成具有外部链接。您需要对测试文件中的声明进行同样的更改。
要对静态函数进行单元测试,这是极少数需要包含.c文件的情况之一:
extern "C"{
#include "A/lib.c"
}
TEST(A,test){
funC();
.....
}
然后static
函数和变量将在测试代码中可见。