1

大家好我希望你能帮助我理解为什么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

在这个例子中,我不明白的部分是如何在 switch 语句中将整数与 char 进行比较。

据我了解,geopt 的主要参数虽然是字符数组 argv,但它处理返回一个 int 的事实对我来说似乎很奇怪,我的期望是一个 char,并且我需要将任何数字参数转换为 int。char 是否会自动转换为它的 ANSI 代码并再次转换回来?printf 语句

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

据我所知,期待一个字符,但被赋予一个整数。为什么 getopt 在处理字符数组时会使用 int ?

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

4

1 回答 1

6

当整数与字符常量进行比较时optopt == 'c',字符常量实际上具有类型int。事实上,在 C 中charandshort是二等公民,int在表达式中总是被提升为,所以传递或返回 a 是没有用的charint无论如何它都被提升了。

getopt这与 C++ 规则不同,但在 C++ 程序中使用 C 函数时应该注意一些printf事项。

getopt 返回an的事实int还有一个原因:它可能返回有效值char(通常为 0..255)-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返回 a char,则无法区分可能有效的(char)(-1)(-1 或 255)与停止条件。有关值的上下文中的更好解释,请参阅此页面EOF,这非常相似。

于 2011-02-23T17:29:09.100 回答