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