我已经实现了一个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

09-09 20:01