C 在检查选项之前处理getopt中的非选项参数

C 在检查选项之前处理getopt中的非选项参数,c,unix,getopt,C,Unix,Getopt,我正在编写一个程序,我想在检查标志之前获取非选项参数 例如,如果参数是/a.out-a-b 50 filename 我想使用filename,然后根据标志执行task\u a()和/或task\u b()filename可以是argv[]中的任何参数 int opt; float value; while ((opt = getopt(argc, argv, "ab:")) != -1) case 'a': task_a(filename);

我正在编写一个程序,我想在检查标志之前获取非选项参数

例如,如果参数是
/a.out-a-b 50 filename

我想使用
filename
,然后根据标志执行
task\u a()
和/或
task\u b()
filename
可以是
argv[]中的任何参数

int opt;
float value;
while ((opt = getopt(argc, argv, "ab:")) != -1)
    case 'a':
        task_a(filename);
        break;
    case 'b':
         value = atof(optarg);
         task_b(filename, value);
         break;


所以基本上我需要先提取
文件名
,然后才能在任务中使用它。如何实现这一点?

getopt将按照在命令行中找到命令行参数的顺序向您传递这些参数。这通常不是您想要处理它们的顺序

相反,在执行操作之前,让您的程序先设置其选项-例如(给定#include):

我选择了“亮度”这个名字作为一个有意义的属性名称——当然你应该自己选择。作为良好的实践,不要将变量命名为“optionA”或类似的名称——变量名称应该描述它们是什么,而不是具体的实现细节

始终想象您的选项可以随着时间的推移而更改字母(现在的选项“a”可能在六个月后变成选项“R”)——这种更改不应该影响任何东西,除了“getopt”参数和“case”语句

编辑以更改:
我最初用“IF(亮度>0)”来写这个问题,但通常认为一个单独的dotaskb变量是更干净、更明确的方法,它不限制参数的可能值。

如果你在Linux上,考虑阅读它,特别是它的部分,谢谢你的回应。我理解这一点,但我的要求也延伸到这样一个事实:任务应该按照
argv
中给出的参数的顺序完成。另外,根据任务的数量,可能需要完成大约10项任务flags@Wind_Fire很乐意帮忙。不管有什么要求,我总是将命令行的解析与执行其任务的程序分离开来。它们是程序执行的两个不同阶段——1)找出用户想要做什么,然后2)执行。不要把它们混在一起。因此,第一阶段的输出是一个结构,详细说明了程序要做的一切,以及要用什么来做。所以如果秩序很重要,那么秩序应该在这个结构中。它确实会带来好处,因为更清晰、更明确的代码在将来需求发生变化时易于维护。
// Set the defaults
bool doTaskA = false;
book doTaskB = false;
float brightness = -1;

int opt;
float value;
while ((opt = getopt(argc, argv, "ab:")) != -1) {
    case 'a':
    doTaskA = true;
    break;
case 'b':
     doTaskB = true;
     brightness = atof(optarg);
     break;
}

filename = ....,,

if (doTaskA) {
      task_a(filename);
}

if (doTaskB) {
    task_b(filename, brightness);
}