为什么`memchr()`函数将`int`用作char类型的参数?

mis*_*yes 6 c char

以下函数int用作第二个参数类型,

memchr(const void *buf, int ch, size_t count);
Run Code Online (Sandbox Code Playgroud)

虽然用于character类型。为什么定义了int用于char类型参数的函数?有什么特殊原因吗?

AnT*_*AnT 5

之所以如此,是因为这是一个非常“古老”的标准函数,它存在于C语言发展的早期。

旧版本的C没有功能原型之类的东西。函数要么未声明,要么使用“未知”参数列表声明,例如

void *memchr(); /* non-prototype declaration */
Run Code Online (Sandbox Code Playgroud)

调用此类函数时,所有参数都会进行自动参数提升,这意味着此类函数从未接收到类型为char或的参数值short。此类参数总是由调用方隐式地提升为type int,而函数本身实际上收到了int。(在现代C中,对于如上所述声明的函数(即没有原型)仍然如此。)

最终,当C语言发展到引入原型函数声明的地步时,将新的声明与标准函数的遗留行为以及已编译的遗留库对齐是很重要的。

这就是为什么你永远不会看到这样的类型的原因charshort在传统的函数声明的参数列表。出于同样的原因,您也不会在其中看到float任何使用的类型。


这也意味着,如果由于某种原因必须为以K&R样式定义的某些现有遗留函数提供原型声明,则必须记住在原型中指定提升的参数类型。例如,功能定义为

int some_KandR_function(a, b, c)
char a;
short b;
float c;
{
}
Run Code Online (Sandbox Code Playgroud)

正确的原型原型声明实际上是

int some_KandR_function(int a, int b, double c);
Run Code Online (Sandbox Code Playgroud)

但不是

int some_KandR_function(char a, short b, float c); // <- Incorrect!
Run Code Online (Sandbox Code Playgroud)