![](/img/trans.png)
[英]Confused about when to use int type or char type when passing a character into a function argument?
[英]Why does the function `memchr()` use `int` for the argument of `char` type?
以下函数使用int
作为第二个参数类型,
memchr(const void *buf, int ch, size_t count);
虽然它用于character
类型。 为什么函数定义为使用int
作为char
类型的参数? 这有什么特殊原因吗?
之所以如此,是因为这是一个非常“古老”的标准函数,它存在于 C 语言演变的早期阶段。
旧版本的 C 没有函数原型之类的东西。 函数要么未声明,要么使用“未知”参数列表声明,例如
void *memchr(); /* non-prototype declaration */
调用此类函数时,所有参数都会自动进行参数提升,这意味着此类函数从未接收过char
或short
类型的参数值。 这样的参数总是被调用者隐式提升为int
类型,而函数本身实际上收到了一个int
。 (这在现代 C 中仍然适用于如上所示声明的函数,即没有原型。)
当 C 语言最终发展到引入原型函数声明的地步时,将新声明与标准函数的遗留行为和已编译的遗留库保持一致是很重要的。
这就是为什么您永远不会在遗留函数声明的参数列表中看到诸如char
或short
类的类型的原因。 出于同样的原因,您也不会看到那里使用了类型float
。
这也意味着,如果出于某种原因,您必须为以 K&R 样式定义的某些现有遗留函数提供原型声明,则必须记住在原型中指定提升的参数类型。 例如对于定义为的函数
int some_KandR_function(a, b, c)
char a;
short b;
float c;
{
}
正确的原型原型声明实际上是
int some_KandR_function(int a, int b, double c);
但不是
int some_KandR_function(char a, short b, float c); // <- Incorrect!
因为char
、 signed char
和unsigned char
是三种不同的类型。 在特定的实现中,您不知道char
是有符号的还是无符号的。
除了在罕见的系统中(参见 Keith 的注释),类型int
包含这三种类型可以具有的所有值。
所有处理字符的标准函数都可以。 我认为原因部分是历史原因(在 C 的某些预标准版本中,函数不能接受char
或unsigned char
参数,就像 varargs 参数不能具有字符类型一样),部分原因是所有此类函数的一致性。
有一些字符处理函数必须使用int
以允许 EOF 的可能性,但memchr
不是其中之一。
C 永远不会将小于 int 的参数传递给函数。 将函数参数定义为 char 或 short 始终提升为 int,而定义 unsigned char 或 unsigned short 参数始终提升为 unsigned int。
如果 unsigned 和 signed char 是问题所在,他们会使用 short(我不记得有一个 short 是 1 字节长的平台)。
当然,使用 int 处理无符号与有符号字符的可能性,因为 memchr 只是比较相等性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.