Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.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 getopt_long使用标志结构成员_C_Long Integer_Getopt - Fatal编程技术网

C getopt_long使用标志结构成员

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

我试图将手册页中的示例改编为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
                    {"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当然不能排除编译错误。再次感谢。