命令行无序切换

时间:2010-10-20 16:46:14

标签: c++ parsing command-line command-line-arguments

我正在开发一个C ++程序,它接受一个文件名作为命令行输入,从该文件读取一堆数据,计算有关数据的两件事,然后退出。其中一个计算必须,但另一个更可选,所以我认为添加一个-c标志来关闭它是很好的。天真地,我只是总是假设如果用户给出两个参数,第一个必须切换计算,第二个给出文件名,但是这会让更多标志更加麻烦。使rm -rf "file"rm -fr "file"rm "file" -rf都作为有效命令工作的标准做法是什么?

6 个答案:

答案 0 :(得分:3)

  

使rm -rf“file”,rm -fr“file”和rm“file”-rf都作为有效命令工作的标准做法是什么?

很多人对此持不同意见,所以似乎没有标准的做法,除非你针对特定的受众(即在编写特定于Linux的命令行工具时,请查看“标准”实用程序的功能)

无论如何,大多数图书馆最终会给你以下选项:

  1. 切换:这些隔离的标志,因为切换后不需要参数。诸如tarrm之类的Unix工具通常允许您一起指定多个标记,就像示例的-rf标记一样。
  2. 选项:这些指定与交换机一样,但在切换后需要一些值。例如,gcc期望在-o之后输出文件的名称。因为他们期望选项,显然不能同时指定。
  3. 短VS长名称:开关和选项通常有两个名称,一个破折号,单个字母或双破折号描述性名称(比较-o--output-file)尽管有些选项,例如帮助或详细程度控制,通常只有很长的名称。
  4. 多个尾随参数:如果该工具允许同时处理同步文件,则这些只在序列的 end 中指定。允许这些与其他选项和标志交错会导致噩梦。如果某些尾随参数可能包含短划线,则表示“选项结束”的--选项也很方便。
  5. 许多工具允许交换机和选项交错,但多个尾随参数总是在最后。

    当然,您会发现不遵守这些惯例的常用工具,例如Microsoft的cl.exelink.exe。最近的工具似乎也趋向于这些,包括微软的candle.exelight.exe为WIX。

    如果您想确保遵守这些准则(并节省大量时间),请使用“标准”库,例如UNIX的getopt()或boost的程序选项。

    修改:现有库通常会使用您在指定期望的开关和选项时提供的简短说明为您生成--help选项。

答案 1 :(得分:2)

使用boost program options。例如:

po::options_description desc("Allowed options");
desc.add_options()
    ("help", "produce help message")
    ("compression", po::value<int>(), "set compression level")
;

po::variables_map vm;
po::store(po::parse_command_line(ac, av, desc), vm);
po::notify(vm);    

if (vm.count("help")) {
    cout << desc << "\n";
    return 1;
}

if (vm.count("compression")) {
    cout << "Compression level was set to " 
 << vm["compression"].as<int>() << ".\n";
} else {
    cout << "Compression level was not set.\n";
}

答案 2 :(得分:1)

UNIX实用程序使用的标准参数解析函数(例如rm)是getopt()。较新的命令可能使用getopt_long(),它处理多个字符(长--symbols与短-s)的所谓“长参数”。

有关其使用示例,请查看this implementation of rm,或者查看手册页。

getopt()已移植到Win32 / MFC。其中一个端口是XGetOpt

答案 3 :(得分:0)

谷歌搜索出现了这个名为“Anyoption”的C ++类。看起来它正是您所需要的。 http://www.hackorama.com/anyoption/

您也可以随时编写自己的解析器。我希望,如果没有别的,写自己的将是一个很好的编程练习,因为它不是太难,但不是微不足道。

答案 4 :(得分:0)

或者,如果你有提升,program_options就可以实现...... http://www.boost.org/doc/libs/1_44_0/doc/html/program_options.html

答案 5 :(得分:0)

您可以在当前的Linux发行版中找到现代GNU工具来演示所需的行为。

旧的讨厌行为可以在FreeBSD和OpenBSD上默认提供的BSD工具中看到。

理想的行为是:

  • 能够在一个地方将所有没有参数的短开关组合在一起
  • 也可以单独提供短期选择。
  • 能够随意混合选项和参数,提供文件名参数之前和之后的选项。
  • 每个选项也应该有一个用两个短划线指定的长而详细的选项。
  • 两个破折号本身应终止选项处理:这样可以处理看起来像选项的文件名。

使用ls的GNU版本,您可以执行此操作:
ls -al *.c -h *.h --reverse -t -- -filename-1 -filename-2

这对命令行用户来说非常好。它应该是。我们写了它。

ls的BSD版本会扼杀它。为了改变一些显示选项,被迫导航回命令的开头是非常烦人的。