Chinaunix

标题: 【请教贴】unix环境高级编程第一章习题1.3 [打印本页]

作者: zhsp1029    时间: 2010-12-30 21:57
标题: 【请教贴】unix环境高级编程第一章习题1.3
本帖最后由 zhsp1029 于 2010-12-30 22:07 编辑

为什么perror的参数是用iso c的属性const定义,而strerror的整形参数却没有用此属性定义?
函数原型为
void perror(const char *s);
char *strerror(int errnum);

我的理解是:perror的参数类型是个指针,用const定义为了防止函数修改此指针指向的内容,防止这个参数误用。因为这是一个指针,有人可能误认为此函数会把出错信息保存在这个指针中。用了const修饰的话,看到这个函数原型的人就不会有这个想法了。
strerror由于参数是个整形,就不会有此误会,所以不用const修饰。

以上只是个人猜测,不知道是否接近设计者的想法,请大虾指教,多谢。
作者: hellioncu    时间: 2010-12-31 08:45
我也这么认为的,很多函数都这么定义的
作者: drangon    时间: 2010-12-31 08:52
个人猜测,由于C89没有const关键字,到了C99支持const时,就可能往函数原型上加const,
对于perror,这种加const是没有影响的,但对于strerror,可能已经写了不少
char * ret = strerror( num );  类似的代码,如果函数原型加了const,这样的代码就会编译出错,
因此从兼容性角度,只能忍痛不加。
作者: veking    时间: 2010-12-31 09:13
函数参数是值传递的,整型参数只是把值传递过去,不会存在把原来变量指向的值修改了,指针就不一样了,如果没有const会把指针指向的值修改了。

void test(const char *a, ...)
在test函数中修改a指针,会有编译错误:
error: assignment of read-only location ‘*a’
作者: 雨过白鹭洲    时间: 2010-12-31 09:26
回复 3# drangon


    char * ret = strerror( num );  

就算num不是const的,明显也不会报错。加const只是表示进入strerror后不能够修改num而已。

一般来说基本类型,如int, long, double, char等,都没有加const的必要
作者: zhsp1029    时间: 2010-12-31 12:54
感谢各位的解答
作者: drangon    时间: 2010-12-31 13:07
回复  drangon


    char * ret = strerror( num );  

就算num不是const的,明显也不会报错。加con ...
雨过白鹭洲 发表于 2010-12-31 09:26



不是说num,是说返回值

原来的函数声明是:

char * strerror( int err );

如果原来写的代码是:

char * ret = strerror( num );

那么如果将函数声明改成
const char * strerror( int err );

那么原来写的代码就会编译不通过。

而将
void perror( char * str );
改成
void perror( const char * str );
则不会引起原来调用这个函数的地方的问题。
作者: tanbaolin1218    时间: 2010-12-31 16:24
void perror(const char *s);这个就和你理解的一样防止修改参数内容
char *strerror(int errnum);这个不怕修改参数内容是因为这项声明参数就是传值了啊,就相当与复制了一份参数传进来,所以没有被修改的可能




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2