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

标签 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 散落在整个代码中的语句也增加了气味。

if (!(silent)){
   fprintf (stdout, "This program can run silently");
}

带有全局变量的三元运算符可能更优雅:

(silent) ? : fprintf(stdout, "This program can run silently");

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

最佳答案

正如 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!

关于c++ - 创建静默 CLI 选项的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26373586/

相关文章:

linux - Debian CLI 安装到闪存驱动器

c++ - 加速度计 'Change in Height' 代码 PIC

c++ - 使用按位运算符将几个整数合并为 unsigned long long(64 位)

C 编程中无法获得正确的输入

C缓冲区溢出攻击

ssh - 通过 shell 与 ssh 连接?

c++ - 如何在创建文件之前测试文件是否存在

c++ - Linux 上 C 中字符数组和指针的段错误

c - 在 C 中使用 atoi() 解析具有二进制值的字符数组

python - 如何在 Ubuntu 中创建新的命令行标志