Code Bye

C语言标准库函数原型设计

最近试着本人实现一些C库中的函数,于是参考了标准库(本人用的是mingw)头文件中的函数声明,发现本人对标准库中函数原型设计存在一些不解的地方。
例如,在string.h中,有如下声明:
1. char* strchr(const char*, int);
该函数是在一个字符串中查找字符首次出现的位置,那么第二个参数为什么是int类型而不是char类型?
2. void* memset(void*, int, size_t);
memset是逐字节操作的,理论上第二个参数设为char类型就足够了,那么函数第二个参数为什么要设置为int类型?
库作者的基本考虑是什么?
解决方案

10

好吧,这个是一个历史原因造成的。原因是在k&R那个时期,也就是远古时代。函数的声明是这样的。
char* strchr();  然后定义函数是这样 char*strchr(s,c)  char*s; char c; {  …  } 你可以看到函数声明是没有参数之类的,不像现在的函数原型 需要有参数类型等信息。这样在传递参数的时候会有个算术转换(现在叫类型提升之类的)就是说凡是比int小的类型 例如char,short传进去之后全部提升为int类型。然后你看到定义里面有char c 这样 又从int转型为char 在函数体里面使用。所以估计后面干脆把类型声明为int也是提醒别人 这里会有个算术转换吧。

10

其实,数学运算,大部分,统一为 int,double
是为了编译器,实现的方便
这样,库代码的实现,也简单方便。
同样,参数传递也是一样
为了编译器实现的方便。

10

当然是有技术原因的,但是和某些文章的说法无关。当初Ken Thompson和Dennis Ritchie 设计C的目的是向PDP-11计算机上移植UNIX系统,PDP-11是16位计算机(一个字节为8位,一个字为2^N个字节就是从PDP-11开始成为标准的,之前并非如此,有18位、36位,甚至60位计算机),尽管PDP-11能够做字节操作(寄存器或内存),但是字节操作比较繁琐而且速度慢,不像x86那么方便,原因是它的寄存器是16位的,没有8位寄存器,于是他们就把基本库的char操作数设计为i16位(int),以便提高性能。C语言的一些特性,跟PDP-11架构密切相关,诸如++、–操作符,原因是PDP-11有自增、自减寻址模式,否则没有必要设计这个东西。

10

引用:

好吧,这个是一个历史原因造成的。原因是在k&R那个时期,也就是远古时代。函数的声明是这样的。
char* strchr();  然后定义函数是这样 char*strchr(s,c)  char*s; char c; {  …  } 你可以看到函数声明是没有参数之类的,不像现在的函数原型 需要有参数类型等信息。这样在传递参数的时候会有个算术转换(现在叫类型提升之类的)就是说凡是比int小的类型 例如char,short传进去之后全部提升为int类型。然后你看到定义里面有char c 这样 又从int转型为char 在函数体里面使用。所以估计后面干脆把类型声明为int也是提醒别人 这里会有个算术转换吧。

翻译的不错呀
http://stackoverflow.com/questions/2394011/why-does-strchr-take-an-int-for-the-char-to-be-found


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言标准库函数原型设计