玩弄getopt

时间:2018-04-10 17:39:09

标签: c++ getopt

嗨,我对编码很新,并试图找出为什么这个getopt不起作用。我的编译器抱怨“我:o:”

错误C2664'int getopt(int,char **,char *)':无法将参数3从'const char [5]'转换为'char *'

int main(int argc, char *argv[])
{
    int opt;
    while ((opt = getopt(argc, argv, "i:o:")) != -1)
    {
        switch (opt)
        {
        case 'i':
            printf("Input file: \"%s\"\n", optarg);
            break;
        case 'o':
            printf("Output file: \"%s\"\n", optarg);
            break;
        }
    }
    return 0;
}    

这很奇怪,因为当我读到关于getopt的时候,我看到了这个“options参数是一个字符串,它指定了对这个程序有效的选项字符。”

2 个答案:

答案 0 :(得分:3)

根据您的错误消息,getopt函数需要可写选项字符串。你可以通过制作一个像这样的非const字符数组来做到这一点:

int main(int argc, char *argv[])
{
    // non-const char array
    char opts[] = "i:o:"; // copy a string literal in

    int opt;
    while ((opt = getopt(argc, argv, opts)) != -1)
    {
        switch (opt)
        {
        case 'i':
            printf("Input file: \"%s\"\n", optarg);
            break;
        case 'o':
            printf("Output file: \"%s\"\n", optarg);
            break;
        }
    }
    return 0;
}

您的原始代码适用于我Linux GCC v7。看来您使用的版本的功能签名是不同的。

我的系统上,它是:

int getopt (int argc, char** argv, const char* options);

但在您的系统上似乎是:

int getopt(int,char **,char *);

最后一个参数缺少const导致错误,这就是为什么你需要给它一个非const 字符串。

注意:我不建议使用const_cast,因为有些人可能会受到诱惑。你永远不知道该函数是如何实现的,或者内部实现是否会在某些时候发生变化。

答案 1 :(得分:-4)

只需使用字符串指针:

char* opts = "i:o:";
getopt(argc, argv, opts);