2013-04-03 62 views
3

以下函数使用int作为第二个参数类型,为什么函数memchr()使用`int`作为`char`类型的参数?

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

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

+2

你可能也想读这个基本上是相同的问题。 http://stackoverflow.com/questions/5919735/why-does-memset-take-an-int-instead-of-a-char – tangrs 2013-04-03 21:45:31

回答

2

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

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

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

当调用这样的功能,所有参数进行自动参数提升,这意味着,这样的功能的没有收到char类型或short的参数值。这样的参数总是自动提升为int,而函数本身实际上收到了int。 (在现代C中,对于上面声明的功能(即没有原型),这仍然是真实的)。

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

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

1

因为char,signed charunsigned char是三种不同的类型。在具体实现中,您不知道char是有符号还是无符号。

除了在罕见的系统中(见Keith的笔记),int类型包含这三种类型可以具有的所有值。

+0

和EOF太.... – 2013-04-03 21:44:19

+1

'EOF'不是字符:) – pmg 2013-04-03 21:45:59

+0

在大多数系统上。如果'sizeof(int)== 1'(暗示'CHAR_BIT> = 16'),那么'int'可能无法保存'unsigned char'类型的所有值。这种系统很少见。 – 2013-04-03 21:46:24

1

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

有几个字符处理函数使用int以允许EOF的可能性,但memchr是不是其中之一。

+0

你真的是指“EOL”吗? – 2013-04-03 21:47:13

+1

@凯斯:不,我不知道 – 2013-04-03 21:48:28

相关问题