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

标签 c char

下面的函数使用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/

相关文章:

java - 虚码和扫码的区别

C 代码(带逗号运算符)到 Delphi

python - 使用数据转换器将 3D 体积显示为图像

c++ - 没有将 char 数组作为输出?

c++ - 为什么第二个字符丢失了第二个变量

c - -> 使用 execv 运行 wc 命令

c - 如何计算平均缓存未命中率 (ACMR)?

c - 尝试取消引用动态分配的指针时出现段错误

c - 打印并扫描字符串 c

c - sprintf 不断返回相同的字符串