问题描述
我正在编写程序,我想在检查标志之前获取非选项参数。
例如,如果参数为./a.out -a -b 50 filename
我想使用filename
,然后根据标志执行task_a()
和/或task_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;
因此,基本上,我需要先提取filename
,然后才能在任务中使用它。我该如何实施?
解决方法
getopt将按照在命令行上找到它们的顺序向您传递命令行参数。通常,这不是您要处理它们的顺序。
相反,请让您的程序在执行操作之前首先设置其选项-类似于(给定#include
// 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);
}
我选择“亮度”作为有意义的属性名称-自然,您应该选择自己的名称。好的做法是,不要将变量命名为“ optionA”或此类名称-变量名称应描述变量的含义,而不是具体的实现细节。
总是想像您的选项可以随时间更改字母(现在选项“ a”可能在六个月后变成选项“ R”)-这种更改应该不会影响“ getopt”参数和“ case”语句之外的任何内容
编辑更改: 我最初使用“ if(brightness> = 0.0)”来编写此代码,但决定通常使用单独的doTaskB变量是更简洁,更明确的方法,而不限制参数的可能值。