C getopt_long使用标志结构成员
我试图将手册页中的示例改编为getopt_long,以便它使用结构的flag成员。 但是我无法通过编译器,它抱怨我初始化flags变量的方式。 我只更改了手册页中代码的一行,请参见下文,但当我尝试编译时,我得到:C getopt_long使用标志结构成员,c,long-integer,getopt,C,Long Integer,Getopt,我试图将手册页中的示例改编为getopt_long,以便它使用结构的flag成员。 但是我无法通过编译器,它抱怨我初始化flags变量的方式。 我只更改了手册页中代码的一行,请参见下文,但当我尝试编译时,我得到: gcc -Wall -c gnu_get_lopt.c gnu_get_lopt.c: In function ‘main’: gnu_get_lopt.c:20:51: error: initializer element is not constant
gcc -Wall -c gnu_get_lopt.c
gnu_get_lopt.c: In function ‘main’:
gnu_get_lopt.c:20:51: error: initializer element is not constant
{"verbose", no_argument, &verbose, 9 },
^
gnu_get_lopt.c:20:51: note: (near initialization for ‘long_options[3].flag’)
这里的其他问题似乎能够使用这种方法。
我做错了什么
pgmer6809
以下是代码的开头:
#include <stdio.h> /* for printf */
#include <stdlib.h> /* for exit */
#include <getopt.h>
int main(int argc, char **argv) {
int c;
int digit_optind = 0;
int verbose;
while (1) {
int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] = {
/* Option, has_arg, flags, Val */
{"add", required_argument, 0, 0 },
{"append", optional_argument, 0, 0 },
{"delete", required_argument, 0, 0 },
/* {"verbose", no_argument, 0, 0 }, // Original GNU provided line. */
{"verbose", no_argument, &verbose, 9 }, /* changed line to use flag */
{"create", required_argument, 0, 'c'},
{"file", required_argument, 0, 0 },
{0, 0, 0, 0 }
};
c = getopt_long(argc, argv, "abc:d:012",
long_options, &option_index);
if (c == -1) // no more options
break; // break from while
<---- remaining program omitted for brevity ------>
} /* end main */
#包括/*用于printf*/
#包括/*用于退出*/
#包括
int main(int argc,字符**argv){
INTC;
整数位数_optind=0;
int冗长;
而(1){
int这个选项=optind?optind:1;
int option_index=0;
静态结构选项长_选项[]={
/*选项,具有参数、标志、值*/
{“添加”,必需的参数,0,0},
{“append”,可选的_参数,0,0},
{“delete”,必需的参数,0,0},
/*{“verbose”,无_参数,0,0},//原始GNU提供的行*/
{“verbose”,无参数,&verbose,9},/*将行更改为使用标志*/
{“create”,必需的_参数,0,'c'},
{“文件”,必需的参数,0,0},
{0, 0, 0, 0 }
};
c=getopt_long(argc,argv,“abc:d:012”,
多头期权和期权指数);
if(c==-1)//没有更多选项
break;//从while中断
}/*端干管*/
long\u options
声明为static
。这意味着变量的初始化需要是一个常量表达式,编译器需要能够“计算”但是int verbose
是一个在进入主函数时创建的变量,在编译时不知道该变量的地址&verbose
您可以执行以下操作之一:
- 从
定义中删除long\u选项
关键字static
- 将
变量定义移动到文件范围verbose
- 将
关键字添加到变量static
verbose
verbose\u标志
变量是在文件范围内声明的,并带有static
。因此,&verbose\u标志
是一个常量表达式,可用于其他静态
变量的初始化
有关更多信息,我建议您阅读和。StackOverflow似乎对格式过于挑剔。在上面的帖子中,我将代码作为带有ctl+K的代码,并将文本重新编译和错误消息作为块引号。因此,在我将块引号格式化为代码之前,请不要让我发布问题。(事实并非如此)此外,他们没有告诉我他们反对帖子的哪一部分。我不得不将问题的各个部分随机格式化为代码,直到最终问题被接受。PGMER6809非常感谢您的快速回复。您对静态效果的解释甚至比您在给我的链接上的解释更好。将静态int设置为verbose go当然不能排除编译错误。再次感谢。