如何防止打印功能?

Pov*_*sID 12 c printf gcc

是否可以使功能静音?例如:

#include <stdio.h>
int function(){
  printf("BLAH!");
  return 10;

}
int main(){
  printf("%d", silence( function()) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)

而不是:

BLAH!
10
Run Code Online (Sandbox Code Playgroud)

我会得到:

10
Run Code Online (Sandbox Code Playgroud)

可能吗?如果积极怎么办呢?

Pas*_*uoq 10

一个非常复杂的方法来做你想要的几乎是使用dup2()系统调用.这需要fflush(stdout); dup2(silentfd, stdout);function()调用之前执行,然后再复制:fflush(stdout); dup2(savedstdoutfd, stdout);.所以不可能这样做silence(function()),因为这个构造只允许在function()已经执行之后执行代码.

文件描述符silentfdsavedstdoutfd具有预先(未测试的代码),以制备:

 int silentfd = open("/dev/null",O_WRONLY);
 int savedstdoutfd = dup(stdout);
Run Code Online (Sandbox Code Playgroud)

这几乎肯定不是你真正想要的,但是因为你的问题被称为"有可能吗?",答案是"几乎".

  • `沉默`可以变成一个宏. (2认同)

BLU*_*IXY 8

使用宏功能和空设备.

例如对于窗户

#include <stdio.h>

#define silence(x) (_stream = freopen("NUL:", "w", stdout), _ret_value = x,_stream = freopen("CON:", "w", stdout),_ret_value)
int _ret_value;
FILE *_stream;

int function(){
  printf("BLAH!");
  return 10;

}
int main(void){
    printf("%d", silence( function()) );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Chi*_*nke 5

不可能.但是,您可以尝试暂时将stdout重定向到其他内容.这可能接近你想要的.


小智 5

您可以使用此宏而不是printf能够阻止打印:

int flag=0;
#define PRINT(...) if(flag){printf(...)}
Run Code Online (Sandbox Code Playgroud)

然后通过考虑变量使用PRINT宏flag.如果flag==1,该功能将打印,如果flag==0,该功能将无法打印.