创建静默CLI选项的最佳实践?

时间:2014-10-15 02:36:33

标签: c++ c command-line-interface

我有一个程序可以编写偶尔的状态更新,但我确定有些人会希望它以静默方式运行,所以我提供了一个-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");

是否有比这些方法更好的做法?我没有看到任何一个缺点吗?

2 个答案:

答案 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”实现起来微不足道。