Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 理解getopt()示例。int与char的比较_C++_C_Integer Promotion - Fatal编程技术网

C++ 理解getopt()示例。int与char的比较

C++ 理解getopt()示例。int与char的比较,c++,c,integer-promotion,C++,C,Integer Promotion,大家好,我希望你们能帮助我理解为什么getopt使用int以及getopt中optopt变量的处理。非常新的C++。< /P> 在getopt中,optopt被定义为一个整数。 这里的例子, 在本例中,我不理解的部分是如何将“c”与switch语句中的字符进行比较 据我所知,geopt的主要参数是字符数组argv,因此它处理返回int的事实对我来说似乎很奇怪,我的期望是一个char,我需要将任何数值参数转换为int。这个char是否自动转换为它的ANSI代码,然后再转换回来?印刷厂 fpri

大家好,我希望你们能帮助我理解为什么getopt使用int以及getopt中optopt变量的处理。非常新的C++。< /P> 在getopt中,optopt被定义为一个整数。

这里的例子,

在本例中,我不理解的部分是如何将“c”与switch语句中的字符进行比较

据我所知,geopt的主要参数是字符数组argv,因此它处理返回int的事实对我来说似乎很奇怪,我的期望是一个char,我需要将任何数值参数转换为int。这个char是否自动转换为它的ANSI代码,然后再转换回来?印刷厂

fprintf (stderr, "Unknown option `-%c'.\n", optopt);
按照我的理解,它需要一个字符,但是被赋予了一个int。为什么getopt在处理字符数组时要使用int


我是不是错过了一些很明显的东西?我必须是。

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

<>这与C++规则不同,但在C++程序中使用诸如GETopt和PrimTf等C函数时,应该注意的是。 getopt返回int还有一个额外的原因:它可能返回有效的char值,通常为0..255或-1。如果要从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值的更好解释,请参见。EOF值非常类似。

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

<>这与C++规则不同,但在C++程序中使用诸如GETopt和PrimTf等C函数时,应该注意的是。 getopt返回int还有一个额外的原因:它可能返回有效的char值,通常为0..255或-1。如果要从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值的上下文中,请看一个更好的解释,这非常相似。< /P>不是真正的C++问题…添加Ctag@neuro添加C标签是个好主意,但是如果OP实际上是写C++ C++,那是很重要的,因为这是语言不同的地方之一。添加Ctag@neuro添加C标签是个好主意,但是如果OP实际上是写C++的话,这是很重要的,因为这是语言不同的地方之一。在C语言中,像“a”这样的常量是int类型,而不是char类型。所以没有什么可以推广的。谢谢,这是有道理的。尤其是EOF链接。我也看到了这一点,这对你的解释很有帮助@汤米:那个教程错误地指出1个字符总是有-128..127的范围,而b个字符则存储ASCII字符。在某些系统上,char的范围为0..255,在任何情况下,它都可以存储8位字符,例如拉丁语-1或UTF-8,以及多字符字符和ASCII。实际上,有些系统中char的宽度为16或32位。getopt可以处理远不止255个选项,因此如果使用,还将返回大于255的值。限制似乎上升到了INT_MAX,因为getopt_long的结构getopt使用INT。@larsman,不,它甚至比这更直接。在C语言中,像“a”这样的常量是int类型,而不是char类型。所以没有什么可以推广的。谢谢,这是有道理的。尤其是EOF链接。我也看到了这一点,这对你的解释很有帮助@汤米:那个教程错误地指出1个字符总是有-128..127的范围,而b个字符则存储ASCII字符。在某些系统上,char的范围为0..255,在任何情况下,它都可以存储8位字符,例如拉丁语-1或UTF-8,以及多字符字符和ASCII。实际上,有些系统中char的宽度为16或32位。getopt可以处理远不止255个选项,因此如果使用,还将返回大于255的值。限制似乎达到了INT_MAX,因为getopt_long的struct getopt使用INT。