c语言 strchr 返回int,为什么strchr需要一个int来找到char?

其原因纯粹是历史的。请注意,在C语言(K& R C)的旧时代,没有功能原型。那些时代的strchr功能将被声明为

char *strchr();

并以K& R风格定义为

char *strchr(s, c)

char *s;

char c;

{

/* whatever */

}

然而,如果在没有原型的情况下声明函数(如上所示),C语言(在K& R C和现代的)中,每个函数调用中传递的参数都受到所谓的默认参数的提升。在默认参数促销下,小于int(或unsigned int)的整数类型始终转换为int(或unsigned int)。即当参数未声明时,每当您将char值作为参数传递时,此值将隐式转换为int,实际上以int形式传递。简而言之也是如此。 (BTW,float通过默认参数促销转换为双倍)。如果在函数内部的参数实际上被声明为一个char(如上面的K&R样式定义),它将被隐式转换回char类型并在函数中用作char。这是它在K& R时代的工作原理,实际上它在现代C中如何运作,当功能没有原型或使用可变参数时。

现在,C语言中的C语言具有函数原型,并使用了现代风格的函数定义语法。为了保留和复制strchr的“传统”功能,如上所述,除了将strchr的参数声明为int并将其明确转换为函数中的char外,我们别无选择。这正是你在引用的代码中观察到的。这正如标准中描述的strchr的功能一样。

此外,如果您有一个已经编译的遗产库,其中strchr是如上所示的K&R风格定义的,并且您决定为该库提供现代原型,则对于strchr的适当声明将为

char *strchr(const char *s, int c);

因为int是上述传统实现期望的物理接收为c。用char参数声明它将是不正确的。

因此,您将永远不会看到“传统”标准库函数,期望char,short或float类型的参数。所有这些函数将被声明为int或double类型的参数。

一个非常相同的理由背后是char指针和void *指针共享相同的表示和对齐要求的标准保证。依靠这个保证,你可以将malloc声明为一个void * -returning函数,然后使用这个声明与预编译的标准库的旧版本,其中malloc实际返回char *。

参考:C99的理由,版本5.10

7.1.4 Use of library functions /–/ All library prototypes are specified in terms of the “widened” types: an argument formerly declared as char is now written as int. This ensures that most library functions can be called with or without a prototype in scope, thus maintaining backwards compatibility with pre-C89 code

本文链接:https://my.lmcjl.com/post/7998.html

展开阅读全文

4 评论

留下您的评论.