了解getopt()示例。 int与char的比较

时间:2011-02-23 17:26:08

标签: c++ c integer-promotion

大家好我希望你能帮助我理解为什么getopt使用了int和getopt中optopt变量的处理。对C ++来说很陌生。

查看getopt,optopt被定义为整数。 http://www.gnu.org/software/libtool/manual/libc/Using-Getopt.html#Using-Getopt

和这里的例子, http://www.gnu.org/software/libtool/manual/libc/Example-of-Getopt.html#Example-of-Getopt

在这个例子中我不理解的部分是如何将`c',一个整数与switch语句中的char进行比较。

据我所知,geopt正在运行的主要论点是字符数组argv,因此它处理的事实返回一个int对我来说似乎很奇怪,我的期望是一个char,我需要转换任何数字参数到int。 char是自动转换为它的ANSI代码又回来了吗? printf语句

fprintf (stderr, "Unknown option `-%c'.\n", optopt);

正如我所理解的那样期待一个char,但是给了一个int。为什么getopt在处理字符数组时会使用int?

我错过了一些非常明显的东西吗?我一定是。

1 个答案:

答案 0 :(得分:6)

当将整数与optopt == 'c'中的字符常量进行比较时,字符常量实际上具有类型int。事实上,在C charshort中是二等公民,并且在表达式中始终被提升为int,因此传递或返回char是没有用的;无论如何它都被提升为int

这与C ++规则不同,但在C ++程序中使用getoptprintf等C函数时应注意的事项。

getopt 返回 int的事实还有另一个原因:它可能会返回有效的char值(通常为0..255)< em>或 -1。如果您希望从char中获得getopt,则必须首先检查-1可能性:

int i = getopt(argc, argv, option_string);
if (i == -1)
    // no more options
else {
    char c = i;
    // got a valid char, proceed
}

如果getopt返回char,则无法将可能有效的(char)(-1)(-1或255)与停止条件区分开来。有关EOF值的上下文中的更好解释,请参阅this page