免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3034 | 回复: 7
打印 上一主题 下一主题

[C] 【请教贴】unix环境高级编程第一章习题1.3 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-30 21:57 |只看该作者 |倒序浏览
本帖最后由 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修饰。

以上只是个人猜测,不知道是否接近设计者的想法,请大虾指教,多谢。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-12-31 08:45 |只看该作者
我也这么认为的,很多函数都这么定义的

论坛徽章:
0
3 [报告]
发表于 2010-12-31 08:52 |只看该作者
个人猜测,由于C89没有const关键字,到了C99支持const时,就可能往函数原型上加const,
对于perror,这种加const是没有影响的,但对于strerror,可能已经写了不少
char * ret = strerror( num );  类似的代码,如果函数原型加了const,这样的代码就会编译出错,
因此从兼容性角度,只能忍痛不加。

论坛徽章:
0
4 [报告]
发表于 2010-12-31 09:13 |只看该作者
函数参数是值传递的,整型参数只是把值传递过去,不会存在把原来变量指向的值修改了,指针就不一样了,如果没有const会把指针指向的值修改了。

void test(const char *a, ...)
在test函数中修改a指针,会有编译错误:
error: assignment of read-only location ‘*a’

论坛徽章:
0
5 [报告]
发表于 2010-12-31 09:26 |只看该作者
回复 3# drangon


    char * ret = strerror( num );  

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

一般来说基本类型,如int, long, double, char等,都没有加const的必要

论坛徽章:
0
6 [报告]
发表于 2010-12-31 12:54 |只看该作者
感谢各位的解答

论坛徽章:
0
7 [报告]
发表于 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 );
则不会引起原来调用这个函数的地方的问题。

论坛徽章:
0
8 [报告]
发表于 2010-12-31 16:24 |只看该作者
void perror(const char *s);这个就和你理解的一样防止修改参数内容
char *strerror(int errnum);这个不怕修改参数内容是因为这项声明参数就是传值了啊,就相当与复制了一份参数传进来,所以没有被修改的可能
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP