C - 为什么getopt在linux上返回255?

时间:2013-06-12 16:45:37

标签: c getopt

我最近一直在使用getopt(来自unistd.h)。我写了一些在使用MinGW的gcc编译的Windows 7下运行良好的代码,而不是在我的Raspberry Pi上的Raspbian Linux下工作(我用gcc编译它们,没有选项; gcc t.c)。出于某种原因,getopt在没有开关的情况下返回int 255或charÿ,实际上它应该返回-1。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
  char t;
  opterr = 0;

  while ((t = getopt(argc, argv, "a:")) != -1)
    switch (t) {
      case 'a':
        printf("-a with argument %s\n", optarg);
        return 0;
      case '?':
        printf("uknown option\n");
        return 1;
      default:
        /* This is always 255 under linux, and is never reached under windows */
        printf("getopt returned int %d (char %c)\n", t, t);
        return 2;
    }

  return 0;
}

我得到的是,实际上在未编程的8位算术中255 -1,所以我试图在while条件中放置一个int cast,但是什么也没做。

1 个答案:

答案 0 :(得分:11)

您的系统/工具链看起来默认为无符号char类型。这意味着当getopt()返回-1时,它将转换为255并存储在t中。然后,255被提升为int类型(保持255)并与-1进行比较,这是无法匹配的。

getopt()会返回int,因此您应该将t声明为int以匹配,但如果您已开始使用char,那么需要使用signed char

除此之外:由于您说您正在使用gcc进行编译,因此如果您希望对程序中的此变量和其他-fsigned-char变量进行签名,您可能还会发现char标志有用。

第二个旁白:您可以通过传递-funsigned-char标志或在Windows测试中将t更改为unsigned char来复制失败,如果这样可以更容易调试。< / p>