Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 一个长期权,其;val";碰巧是“0”?_C_Glibc_Getopt - Fatal编程技术网

C 一个长期权,其;val";碰巧是“0”?

C 一个长期权,其;val";碰巧是“0”?,c,glibc,getopt,C,Glibc,Getopt,从 它是一个未设置标志的长选项,还是一个“val”恰好为0的长选项 “{0,0,0,0}”指定了什么类型的选项?如果该选项设置了一个标志,即,。标志不是空指针,则: 若该标志不是空指针,则意味着该选项应设置为空 程序中的标志。该标志是一个int类型的变量,您可以 定义在标志字段中输入标志的地址。放入val 字段希望此选项存储在标志中的值。在里面 在这种情况下,getopt_long返回0 示例代码在这里不使用仅设置标志的选项;这种可能性将在下文中处理: {0,0,0,0}仅仅是一个哨兵,因为选项

它是一个未设置标志的长选项,还是一个“val”恰好为
0
的长选项


“{0,0,0,0}”指定了什么类型的选项?

如果该选项设置了一个标志,即,
。标志
不是空指针,则:

若该标志不是空指针,则意味着该选项应设置为空 程序中的标志。该标志是一个int类型的变量,您可以 定义在标志字段中输入标志的地址。放入val 字段希望此选项存储在标志中的值。在里面 在这种情况下,getopt_long返回0

示例代码在这里不使用仅设置标志的选项;这种可能性将在下文中处理:

{0,0,0,0}
仅仅是一个哨兵,因为
选项
结构的数组必须“以包含所有零的元素”终止

编辑: 所有零(
{0,0,0,0}
)元素在
getopt_long()
中内部使用,以确定何时到达
option
结构数组的末尾。发生这种情况时,返回值
-1
。示例代码中的
while(1)
循环首先检查这一点,并在这种情况下终止循环:

/* Detect the end of the options. */
      if (c == -1)
        break;
什么样的选项将使程序进入
案例0
printf(“选项%s”,长选项[option\u index].name”)


如果选项的
.val
字段恰好包含
0
,则作为空指针的
.flag
将导致
getopt_long()
返回此值(
0
)。案例0中第一个
if
语句后面的代码检查这种可能性。这可能是为了在本示例代码中说明,来自
getopt_long()
0
返回值本身可能并不表示设置了标志。但这是一种特殊情况,示例中的数组元素不会导致到达
printf()
语句。这甚至可以被认为是一种退化的情况;最好避免在选项的
.val
字段中使用
0
,并避免在此处指定数值,以支持使用字符常量的约定,如示例中所示。如果采用此约定,则需要
.val
字段中的
'\0'
值来触发此行为。

结构选项中的
标志
字段不为空时,
getopt_long
将为该选项返回0,
val
字段的值存储在
标志
中给出的地址

因此,在上面的示例中,当给出“verbose”选项时,
getopt_long
将返回0,
verbose_flag
设置为1。类似地,对于“简短”选项,
getopt_long
将返回0,
verbose_flag
设置为0

所有字段均设置为零的数组末尾的选项是一个标志,指示选项列表的结尾,用于代替传入数组长度。因为all zero元素只是数组的末尾指示符,而不是true选项,所以不需要处理它

从:

longopts
是指向在as中声明的
struct option
数组的第一个元素的指针

struct option {
    const char *name;
    int         has_arg;
    int        *flag;
    int         val;
};
不同字段的含义如下:

名字

是长选项的名称

你有空吗

is:
无参数
(或0),如果选项不带参数;
必需参数
(或1),如果选项需要参数;或
可选参数
(或2),如果选项采用可选参数

指定如何返回长选项的结果。如果标志为空, 然后getopt_long()返回val。(例如,调用程序可能 将val设置为等效的短选项字符。)否则, getopt_long()返回0,标志指向设置为的变量 如果找到该选项,则为val,如果未找到该选项,则保持不变 找到。

瓦尔

要返回的值,或要加载到 旗帜

数组的最后一个元素必须用零填充。


至于什么样的选项会在
案例0:
中通过
中断
并调用
printf
,一个带有0(或NULL)的选项表示
标志
,0表示
,以及一个非NULL的
名称
,即
{“other_option”,必需的参数,0,0}
。列表中没有这样的选项,这样代码就不会被执行,但它可能被包括在内,作为对未来可能会执行类似操作的代码的安全检查。

阅读文档和阅读答案之间的区别是什么?@alk这更容易被谷歌找到……真正的文档在这里:没有被spawn破坏,并且保持有序。谢谢,(1)为什么“数组的最后一个元素必须用零填充”?(2) 示例中的while循环是否对全零元素进行迭代?如果是,那么
getopt_long
如何处理所有零元素?(3) 在本例中,什么样的选项可以同时到达
案例0
(即
getopt\u long
返回
0
)和
printf(“选项%s”,long\u options[option\u index].name)
(即
long\u options[option\u index]。标志
0
?谢谢。“因为全零元素只是数组的末尾指示符,不是真选项,所以不需要处理它。”当
getopt\u long
返回
-1
时,
while(1)何时返回
loop terminate?@Tim
getopt\u long
在处理完所有选项后返回-1。上面的代码在t中调用
break
/* Instead of reporting ‘--verbose’
     and ‘--brief’ as they are encountered,
     we report the final status resulting from them. */
  if (verbose_flag)
    puts ("verbose flag is set");
/* Detect the end of the options. */
      if (c == -1)
        break;
struct option {
    const char *name;
    int         has_arg;
    int        *flag;
    int         val;
};