我正在阅读 Advanced Linux Programming 的第 2 章:
http://www.advancedlinuxprogramming.com/alp-folder/alp-ch02-writing-good-gnu-linux-software.pdf
在 2.1.3 使用 getopt_long
部分,有一个示例程序,大致如下:
int main (int argc, char* argv[]) {
int next_option;
// ...
do {
next_option = getopt_long (argc, argv, short_options, long_options, NULL);
switch (next_option) {
case ‘h’: /* -h or --help */
// ...
}
// ...
引起我注意的一点是 next_option 被声明为一个 int。函数 getopt_long() 显然返回一个 int 表示短命令行参数,该参数在以下 switch 语句中使用。为什么这个整数可以与 switch 语句中的字符进行比较?
是否存在从 char(单个字符?)到 int 的隐式转换?上面的代码如何有效? (查看链接 pdf 中的完整代码)
最佳答案
C 和 C++ 都没有可以将“字符”存储为具有某些专用字符特定属性的值的类型。从这个意义上说,C 和 C++ 中都没有“字符”类型。
在 C++ 和 C 语言中 char
是一个整体类型。它包含数字。它只是一个最小的(就范围而言)整数类型。 char
之间的转换和 int
存在,就像它存在于 int
之间一样和 long
或 int
和 short
. char
在其他整数类型中没有特殊地位(除了 char
类型与 signed char
类型不同的事实)。
'h'
形式的文字在 C++ 中有类型 char
, 但与任何其他整数类型一样,它与 int
相当.这就是为什么您可以在 case
中使用它的原因标记它在您的原始示例中的使用方式。
换句话说,您的原始代码与
switch (next_option) {
case 1L: ...
// ...
}
会。在这种情况下 switch
参数是 int
, 但案例标签是 long
.代码有效。你觉得奇怪吗?可能不会。你的例子 'h'
差别不大。
关于C++:可以为一个 int 分配一个 char* 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3593764/