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对结构标记和函数标识符使用不同的名称空间。
解决所有问题的方法不是使用宏或其他解决方法,而是实现一个用于命名类型和函数的编码标准。