【问题标题】:Understanding getopt() example. Comparison of int to char了解 getopt() 示例。 int 与 char 的比较
【发布时间】:2011-07-02 22:37:00
【问题描述】:

大家好,我希望你能帮助我理解为什么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 语句中将整数与字符进行比较。

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

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

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

我是否遗漏了一些非常明显的东西?我一定是。

【问题讨论】:

  • 不是一个真正的 C++ 问题...添加了 C 标签
  • @neuro:添加 C 标签是个好主意,但如果 OP 实际上是在编写 C++,这非常重要,因为这是语言不同的地方之一。

标签: c++ c integer-promotion


【解决方案1】:

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

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

getopt返回int 的事实还有一个原因:它可能返回一个有效的char 值(通常为 0..255) -1。如果你想从getopt 中得到一个char,你必须首先检查-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)与停止条件。请参阅 this page 以获得在 EOF 值的上下文中的更好解释,这非常相似。

【讨论】:

  • @larsman,不,它比这更直接。在 C 中,像'a' 这样的常量属于int 类型,而不是char 类型。所以没有什么可推广的。
  • 谢谢,这是有道理的。尤其是 EOF 链接。刚刚看了这个也补充了你的解释。 iu.hio.no/~mark/CTutorial/CTutorial.html#char
  • @Tommy:该教程错误地指出(1)char 始终具有范围 -128..127,它不一定具有,并且(b)char 存储 ASCII 字符.在某些系统上,char 的范围为 0..255,无论哪种情况,它都可以存储八位字符(例如 Latin-1 或 UTF-8,作为多char 字符)以及 ASCII。
  • 其实有些系统char是16位或者32位宽的。
  • getopt 可以处理的不仅仅是 255 个选项,因此如果这样使用,也会返回 >255 以上的值。由于 struct getopt(用于 getopt_long)使用整数,因此限制似乎上升到 INT_MAX。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 2011-07-02
  • 1970-01-01
  • 2012-04-29
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多