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

时间:2013-04-03 21:39:52

标签: c char

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

memchr(const void *buf, int ch, size_t count);

虽然它用于character类型。为什么定义函数使用int作为char类型的参数?这有什么特别的原因吗?

4 个答案:

答案 0 :(得分:3)

之所以如此,是因为这是一个非常“旧”的标准函数,它存在于C语言演化的早期阶段。

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

void *memchr(); /* non-prototype declaration */

调用此类函数时,所有参数都受到自动参数提升的约束,这意味着此类函数从未收到类型为charshort的参数值。这些参数总是自动提升为int类型,函数本身实际上收到了int。 (对于如上所示声明的函数,在现代C中仍然如此,即没有原型。)

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

这就是为什么你永远不会在遗留函数声明的参数列表中看到charshort这样的类型的原因。出于同样的原因,您也不会在那里看到类型float

答案 1 :(得分:1)

因为charsigned charunsigned char是三种不同的类型。在具体实现中,您不知道char是签名还是未签名。

除了稀有系统(参见Keith的注释),类型int包含这三种类型可以拥有的所有值。

答案 2 :(得分:1)

所有处理字符的标准函数都可以。我认为原因部分是历史的(在一些预标准版本的C中,函数不能采用charunsigned char参数,就像varargs参数不能有字符类型一样)和部分为了保持所有这些功能的一致性。

有一些字符处理函数 使用int以便允许EOF,但memchr不是其中之一。

答案 3 :(得分:0)

C永远不会将小于int的参数传递给函数。将函数参数定义为char或short总是提升为int,定义无符号char或unsigned short参数总是提升为unsigned int。
如果未签名的字符与签名的字符是问题所在,则它们将使用short(我不记得其中short是1字节长的单个平台)。
当然,使用int可以处理unsigned vssigned char的可能性,因为memchr仅在比较相等性。