7

我最近一直在玩弄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;
}

我遇到的一个问题是,实际上 255在 8 位非单数算术中-1,所以我尝试在 while 条件下进行 int 类型转换,但这并没有起到任何作用。

4

1 回答 1

13

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

getopt()返回int,所以你应该真正声明匹配,但如果你设置为 using t,你将需要使用.intcharsigned char

旁白:既然您说您正在使用 gcc 进行编译,那么如果您希望对程序中的这个和其他变量进行签名,您可能还会发现该-fsigned-char标志很有帮助。char

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

于 2013-06-12T16:47:06.970 回答