C - 如何抑制子函数的输出?

Posted

技术标签:

【中文标题】C - 如何抑制子函数的输出?【英文标题】:C - How to suppress a sub function's output? 【发布时间】:2012-11-09 23:51:10 【问题描述】:

我想在foo()中调用bar()bar()会改变一些全局变量的值(这是我想要的),但同时产生一些输出(我不想要任何输出);

void foo() 

    //I have tried:
    //system("1>&/dev/null") and of course this won't work
    bar();

我能做些什么来抑制bar()的输出?

【问题讨论】:

【参考方案1】:

可以在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 切换回控制台(或管道)之前打印的任何内容都不会打印。

【讨论】:

可能在基于 Unix 的系统(Linux、Mac OS X)下工作。永远不会在 Windows 下工作,因为在 Windows 世界中,像“/dev/null”这样的文件路径是不可能的。 可以像在fdopen 通话中那样分配stdout 吗?标准是否指定标准输出必须是l-value?最好这样做 - ***.com/a/7664951/922712 很确定重新分配stdout 是未定义的行为。标准只是说stdout 是一个解析为FILE* 类型表达式的宏。它不一定是左值,例如,它可能是函数调用的结果,在这种情况下它是不可赋值的。 @user93353:你是对的,修正了我的答案,并添加了跨平台处理。 嗯,这里的花哨或简单的方法都不适用于 macos。

以上是关于C - 如何抑制子函数的输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何抑制斯坦福 NLP ColumnDataClassifier.makeClassifier() 函数的标准输出

在函数中抑制 cout 输出

选择性地抑制输出python [重复]

如何在运行 IPython 的 Jupyter 中抑制输出?

matlab怎么在主函数中调用子函数计算出来的值

C语言如何在子函数中对主函数中的二维数组值进行修改? 二维数组已经在主函数中用动态数组分配了空间。