下面的函数使用int
作为第二个参数类型,
memchr(const void *buf, int ch, size_t count);
尽管它用于字符
类型。为什么函数定义为使用int
作为char
类型的参数?这有什么特殊原因吗?
最佳答案
之所以如此,是因为这是一个非常“古老”的标准函数,它在 C 语言发展的早期就已经存在。
旧版本的 C 没有函数原型(prototype)这样的东西。函数要么未声明,要么使用“未知”参数列表声明,例如
void *memchr(); /* non-prototype declaration */
调用此类函数时,所有参数都受到自动参数提升的影响,这意味着此类函数从未接收到 char
类型的参数值或 short
.此类参数总是由调用者隐式提升为类型 int
函数本身实际上收到了 int
. (对于如上所示声明的函数,即没有原型(prototype)的现代 C 语言,这仍然适用。)
当 C 语言最终发展到引入原型(prototype) 函数声明的程度时,重要的是使新声明与标准函数的遗留行为以及已编译的遗留库保持一致。
这就是为什么您永远不会看到 char
这样的类型的原因或 short
在遗留函数声明的参数列表中。出于同样的原因,您不会看到类型 float
也在那里使用。
这也意味着如果出于某种原因您必须为以 K&R 样式定义的某些现有遗留函数提供原型(prototype)声明,您必须记住在原型(prototype)中指定提升参数类型。例如。对于定义为
的函数int some_KandR_function(a, b, c)
char a;
short b;
float c;
{
}
正确的原型(prototype)原型(prototype)声明实际上是
int some_KandR_function(int a, int b, double c);
但不是
int some_KandR_function(char a, short b, float c); // <- Incorrect!
关于c - 为什么函数 `memchr()` 使用 `int` 作为 `char` 类型的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15798661/