Stubbing一个在C++中具有相同名称参数的C函数


int stat(const char *__restrict__ __file, struct stat *__restrict__ __buf); 

在使用Google单元测试进行的单元测试中,为了覆盖更多分支,需要对该函数进行存根处理。

文件内存根.h

我必须存根这个函数,所以我提供了以下原型:

int stat_stub(const char *__restrict__ __file, struct stat *__restrict__ __buf);

紧随其后的是:

#define stat stat_stub
int stat_RET;

stubs.c中的实现

int stat_stub(const char *__restrict__ __file, struct stat *__restrict__ __buf)
{
return stat_RET;
}

问题是,define还将struct-stat替换为truct-stat_stub,这会导致编译时出现大量错误。

我想知道是否有解决这个问题的方法,因为我目前正处于困境

您可以使用带参数的宏。

#define stat(p1,p2) stat_stub(p1,p2)

您根本不必使用宏,相反,您可以在构建系统中使其有所不同。


删除stubs.h,并在生产代码中仅使用实头。

stubs.c中定义具有相同名称的函数:

int stat(const char *__restrict__ __file, struct stat *__restrict__ __buf)
{
return stat_RET;
}

现在,在构建生产目标时,您可以将实际实现联系起来。对于UT目标,您构建并链接stubs.c

此解决方案将比宏更通用,更易于维护。

所有问题的根源在于对类型和函数的命名是一样的。不要这么做,除非这是一个C++构造函数。它看起来不像。此代码在C中编译的唯一原因是,C对结构标记和函数标识符使用不同的名称空间。

解决所有问题的方法不是使用宏或其他解决方法,而是实现一个用于命名类型和函数的编码标准。

最新更新