与外部 C 但"has not had a body defined"错误



我有一个没有测试的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函数和变量将在测试代码中可见。

最新更新