我有一个程序可以编写偶尔的状态更新,但我确定有些人会希望它以静默方式运行,所以我提供了一个-s / --silent CLI选项。让我的程序遵守该参数的最佳方法是什么?
此方法添加了一个全局变量,并且仍然执行fprintf函数,稍微增加了气味。
FILE *outfile
if (silent) {
*outfile = NULL;}
else {
*outfile = stderr;}
fprintf (outfile, "This program can run silently");
此方法还会添加一个全局变量,如果在整个代码中散布的语句也会增加气味。
if (!(silent)){
fprintf (stdout, "This program can run silently");
}
具有全局变量的三元运算符可能更优雅:
(silent) ? : fprintf(stdout, "This program can run silently");
是否有比这些方法更好的做法?我没有看到任何一个缺点吗?
答案 0 :(得分:2)
正如Don Shankin在评论中所说,最可维护的方法是将fprintf()包装在一个实现过滤逻辑的函数中,然后让代码调用包装函数而不是直接调用fprintf()。这样,您只需要在一个位置实现过滤逻辑,而不是在整个地方实现过滤逻辑。这是一个演示该技术的程序:
#include <stdio.h>
#include <stdarg.h>
bool silent = false;
void my_fprintf(FILE * outFile, const char * fmt, ...)
{
if (silent == false)
{
va_list argsList;
va_start(argsList, fmt);
vfprintf(outFile, fmt, argsList);
va_end(argsList);
}
}
int main(int argc, char ** argv)
{
my_fprintf(stdout, "Not silent now...\n");
silent = true;
my_fprintf(stdout, "But now I'm silent, so you won't see this!\n");
silent = false;
my_fprintf(stdout, "Silent is false again!\n");
return 0;
}
......这是程序的输出:
Not silent now...
Silent is false again!
答案 1 :(得分:1)
由于它也标记了C ++,我想指出你可以通过调用std::cout
替换std::cout.rdbuf(newbuf)
的输出缓冲区。 “devnull buff”实现起来微不足道。