可以在bar();之前保存全局变量stdout,然后设置为/dev/null,然后恢复。代码示例;
#include <stdio.h>
int main() {
int old_stdout = dup(1);
freopen ("/dev/null", "w", stdout); // or "nul" instead of "/dev/null"
printf("asd1");
fclose(stdout);
stdout = fdopen(old_stdout, "w");
printf("asd2");
return 0;
}
在 OS X 上测试,不确定 Windows。
编辑:您可以在 Windows 上将 /dev/null 替换为 nul。至于在 Windows 下工作的 fdopen() 和 dup() - 根据我的 man 页面,它们是 POSIX.1 标准的一部分,但我还没有测试过。
编辑 2: 如 cmets 中所建议,如果该解决方案不适用于 Windows,this SO answer 中还有另一个建议。
编辑 3: 一种更长但符合标准且跨平台的方法如下。 (代码改编自提到的 SO 问题和 Microsoft 的 _dup 文档)
#include <stdio.h>
#ifdef _WIN32
#include <io.h>
char * const nulFileName = "NUL";
#define CROSS_DUP(fd) _dup(fd)
#define CROSS_DUP2(fd, newfd) _dup2(fd, newfd)
#else
#include <unistd.h>
char * const nulFileName = "/dev/null";
#define CROSS_DUP(fd) dup(fd)
#define CROSS_DUP2(fd, newfd) dup2(fd, newfd)
#endif
int main() {
int stdoutBackupFd;
FILE *nullOut;
/* duplicate stdout */
stdoutBackupFd = CROSS_DUP(STDOUT_FILENO);
fflush(stdout);
nullOut = fopen(nulFileName, "w");
CROSS_DUP2(fileno(nullOut), STDOUT_FILENO);
printf("asd1\n");
fflush(stdout);
fclose(nullOut);
// Restore stdout
CROSS_DUP2(stdoutBackupFd, STDOUT_FILENO);
close(stdoutBackupFd);
printf("asd2\n");
return 0;
}
需要刷新以确保 (1) 在切换 stdout 之前打印的任何内容确实打印到屏幕上,以及 (2) 在将 stdout 切换回控制台(或管道)之前打印的任何内容都不会打印。