我已经实现了一个facade模式,它在下面使用C函数,我想正确地测试它。
我不能真正控制这些C函数。它们在头中实现。现在,我#ifdef在生产中使用实际的头,在测试中使用模拟的头。在C语言中有没有一种方法可以在运行时通过重写C函数地址或其他东西来交换C函数?我想去掉代码中的ifdef。
最佳答案
要详细说明巴特的答案,请考虑下面这个简单的例子。
#include <stdio.h>
#include <stdlib.h>
int (*functionPtr)(const char *format, ...);
int myPrintf(const char *fmt, ...)
{
char *tmpFmt = strdup(fmt);
int i;
for (i=0; i<strlen(tmpFmt); i++)
tmpFmt[i] = toupper(tmpFmt[i]);
// notice - we only print an upper case version of the format
// we totally disregard all but the first parameter to the function
printf(tmpFmt);
free(tmpFmt);
}
int main()
{
functionPtr = printf;
functionPtr("Hello world! - %d\n", 2013);
functionPtr = myPrintf;
functionPtr("Hello world! - %d\n", 2013);
return 0;
}
输出
Hello World! - 2013
HELLO WORLD! - %D