如果我用glib的testharness测试函数,我总是面对一个丑陋的事实,即函数的输出与glib函数的输出混合在一起。 这段代码:
#include <stdlib.h>
#include <glib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
void to_test(void)
{
printf("this function is being tested");
}
void test_to_test(void)
{
to_test();
}
int main(int argc, char *argv[])
{
g_test_init(&argc, &argv, NULL);
g_test_add_func("/test", test_to_test);
return g_test_run();
}
产生
/test: this function is being testedOK
我找到的唯一解决方案是在调用函数时将standardout / -err的文件描述符重定向到/ dev / null,然后重置它们,如:
void test_to_test(void)
{
int backup, new;
new = open("/dev/null", O_WRONLY);
backup = dup(STDOUT_FILENO);
dup2(new, STDOUT_FILENO);
to_test();
fflush(stdout);
close(new);
dup2(backup, STDOUT_FILENO);
}
输出看起来像预期的那样:
/test: OK
不幸的是,这种方法是1.)丑陋和2.)POSIX特定。所以我的问题是:有没有其他方法可以做到这一点,所以代码是可移植的,同时具有吸引力?
提前致谢!
你的无尽的,美丽的,超然的爱 floxo
答案 0 :(得分:0)
使用freopen
和/或fdopen
即可。不幸的是,没有一种跨平台的方法可以做到这一点,幸运的是,Windows有一个fdopen
等价物你可以使用(Is there a Windows equivalent to fdopen for HANDLEs?)。
请注意,这仅在使用stdio时才有效。如果出于某种原因直接写入fd
,它将无法工作作为长期推荐,为什么不使用fprintf
呢?并在您的结构中维护FILE*
字段,该字段可以定向到自定义输出或任何地方。