以下函数使用int
作为第二个参数类型
memchr(const void *buf, int ch, size_t count);
虽然它用于character
类型。为什么定义函数使用int
作为char
类型的参数?这有什么特别的原因吗?
答案 0 :(得分:3)
之所以如此,是因为这是一个非常“旧”的标准函数,它存在于C语言演化的早期阶段。
旧版本的C没有函数原型这样的东西。函数要么未声明,要么使用“未知”参数列表声明,例如
void *memchr(); /* non-prototype declaration */
调用此类函数时,所有参数都受到自动参数提升的约束,这意味着此类函数从未收到类型为char
或short
的参数值。这些参数总是自动提升为int
类型,函数本身实际上收到了int
。 (对于如上所示声明的函数,在现代C中仍然如此,即没有原型。)
当最终C语言发展到引入 prototype 函数声明时,重要的是将新声明与标准函数的遗留行为和已编译的遗留库对齐。
这就是为什么你永远不会在遗留函数声明的参数列表中看到char
或short
这样的类型的原因。出于同样的原因,您也不会在那里看到类型float
。
答案 1 :(得分:1)
因为char
,signed char
和unsigned char
是三种不同的类型。在具体实现中,您不知道char
是签名还是未签名。
除了稀有系统(参见Keith的注释),类型int
包含这三种类型可以拥有的所有值。
答案 2 :(得分:1)
所有处理字符的标准函数都可以。我认为原因部分是历史的(在一些预标准版本的C中,函数不能采用char
或unsigned 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仅在比较相等性。