我最近一直在使用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,但是什么也没做。
答案 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>