C通过‘的参数2的警告;getopt’;来自不兼容的指针类型

C通过‘的参数2的警告;getopt’;来自不兼容的指针类型,c,C,我使用getopt()编写一个函数,从命令行获取选项。当我编译它时,我得到以下警告: cc1: warnings being treated as errors csim.c: In function ‘getArg’: csim.c:157: error: passing argument 2 of ‘getopt’ from incompatible pointer type /usr/include/getopt.h:152: note: expected ‘char * const*’

我使用
getopt()
编写一个函数,从命令行获取选项。当我编译它时,我得到以下警告:

cc1: warnings being treated as errors
csim.c: In function ‘getArg’:
csim.c:157: error: passing argument 2 of ‘getopt’ from incompatible 
pointer type /usr/include/getopt.h:152: note: expected ‘char * const*’ 
but argument is of type ‘const char **’
下面是C代码:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
}

int getArg(int argc, char const *argv[], int *verbose, int *ps, 
    int *pE, int *pb, char *traceFileName){
    int arg;
    int argCount;
    while ((arg = getopt(argc, argv, "vs:E:b:t:")) != -1){
        switch (arg){
            case 'v':
            *verbose = 1;
            break;

            default:
            printf("%s\n", "Illegal command arguments, please input again");
            exit(-1);
            break;
        }
    }

    if(argCount < 4){
        printf("%s\n", "Illegal command arguments, please input again");
            exit(-1);
    }
    return 0;
}
#包括
#包括
#包括
#包括
int main(){
}
int getArg(int argc,char const*argv[],int*verbose,int*ps,
int*pE,int*pb,char*traceFileName){
int-arg;
int argCount;
while((arg=getopt(argc,argv,“vs:E:b:t:”)!=-1){
开关(arg){
案例“v”:
*详细=1;
打破
违约:
printf(“%s\n”,“命令参数非法,请重新输入”);
出口(-1);
打破
}
}
如果(argCount<4){
printf(“%s\n”,“命令参数非法,请重新输入”);
出口(-1);
}
返回0;
}

这是函数声明argv的方式。你改变了康斯特内斯。错误消息告诉您出了什么问题

问题是,正如错误所说,您正在传递一个
const char**
,其中需要一个
char*const*
。具体来说,您正在将
argv
(类型错误)传递给getopt。您可以通过更改
argv
的类型来解决此问题

int getArg(int argc, char * const argv[], int *verbose, int *ps, int *pE, int *pb, char *traceFileName)

谢谢davmac!我在一些代码中看到main()函数类似于main(int argc,char*argv)。那么,char*const argv[]、char-const argv[]和char**argv有什么区别呢?
char*const argv[]
是一个由
char*
值组成的不可修改数组。它可以转换为指针(特别是
char*const*
,即指向不可修改的
char*
值的指针)
char const argv[]
将是一个不可修改的字符值数组
char**argv
是指向char指针的指针;可以将其视为
char*
的数组。