免费注册 查看新帖 |

Chinaunix

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

请教一个关于代码规范化的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-25 11:32 |只看该作者 |倒序浏览
近日在看GNU coreutils 的代码,有一点疑惑。请看:

void
usage (int status)
{
  if (status != EXIT_SUCCESS)
    fprintf (stderr, _("Try `%s --help' for more information.\n"),
         program_name);
  else
    {
      printf (_("\
Usage: %s NAME [SUFFIX]\n\
  or:  %s OPTION\n\
"
),
          program_name, program_name);
      fputs (_("\
Print NAME with any leading directory components removed.\n\
If specified, also remove a trailing SUFFIX.\n\
\n\
"
), stdout);
      fputs (HELP_OPTION_DESCRIPTION, stdout);
      fputs (VERSION_OPTION_DESCRIPTION, stdout);
      printf (_("\
\n\
Examples:\n\
  %s /usr/bin/sort       Output \"sort\".\n\
  %s include/stdio.h .h  Output \"stdio\".\n\
"
),
          program_name, program_name);
      printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
    }
  exit (status);
}



1. 为什么字符串要用 _( ) 包起来?
2. 为什么这段代码里面有时用 printf 有时却用 fputs ?

望高手解惑,多谢。

论坛徽章:
0
2 [报告]
发表于 2008-01-25 11:45 |只看该作者
1. 估计是为了方便在unicode和ascii之间切换
当字符串为ascii码时,#define _(x) x
当字符串为unicode时,#define _(x) L##x

2. puts比printf效率要高一些,因为puts不需要对字符串做任何解释,直接输出。而printf要先对format字符串做一次扫描,解释其中%定义的格式控制符。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-01-25 11:48 |只看该作者
1,_ 应该是个宏,你一路查下去,可能会查到 gettext。不过我不确定,纯属猜测。
2,puts 有 puts 的用途,puts 能搞定的地方,不用 printf 也可以。但有些地方 puts 搞不定,自然要用 printf 了,难道照你的意思打算废了 puts?

论坛徽章:
0
4 [报告]
发表于 2008-01-25 11:50 |只看该作者
1> _("")这种定义是说这个字符串是宽字符串。(windows是这样用的)
2> fputs是直接把字符串写道stdout输出上而且不用考虑format之类的。用printf需要考虑一些格式等。这个应该就是个习惯吧!其实用fputs也没怎么提高效率(个人观点)。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2008-01-25 12:05 |只看该作者
原帖由 weigongwan 于 2008-1-25 11:50 发表
1> _("")这种定义是说这个字符串是宽字符串。(windows是这样用的)
2> fputs是直接把字符串写道stdout输出上而且不用考虑format之类的。用printf需要考虑一些格式等。这个应该就是个习惯吧!其实用fputs也没怎 ...

呵呵,你小看 puts 了,它虽然提高不了多少效率,但是能提高不少安全性。
严格地讲,如果需要 puts 的时候,你不用 puts 而用 printf,那么你应该这么写:
printf( "%s", string );
但是实际工作中很少见人这么写。此时,如果用 puts 就会安全很多。

论坛徽章:
0
6 [报告]
发表于 2008-01-25 12:35 |只看该作者
原帖由 flw 于 2008-1-24 20:05 发表

呵呵,你小看 puts 了,它虽然提高不了多少效率,但是能提高不少安全性。
严格地讲,如果需要 puts 的时候,你不用 puts 而用 printf,那么你应该这么写:
printf( "%s", string );
但是实际工作中很少见人 ...

没记错的话,printf那个问题只有在string是用户可构造的的情况下有问题吧,对于这些常量字符串,直接printf应该是没有问题的。

回到正题,窃以为学代码风格就不要看gnu的代码,gnu的代码还没看到啥风格很舒服的(如果谁知道有赶紧来说,让我改变这个印象 )

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
7 [报告]
发表于 2008-01-25 13:04 |只看该作者
原帖由 flw 于 2008-1-25 12:05 发表

呵呵,你小看 puts 了,它虽然提高不了多少效率,但是能提高不少安全性。
严格地讲,如果需要 puts 的时候,你不用 puts 而用 printf,那么你应该这么写:
printf( "%s", string );
但是实际工作中很少见人 ...

printf( "%s", string );
我一般会这么做 不过觉得很麻烦

gcc优化能把printf("a");优化成putc
不过printf("aaa");不会改成puts

论坛徽章:
0
8 [报告]
发表于 2008-01-25 13:08 |只看该作者
原帖由 flw 于 1/25/2008 12:05 发表

呵呵,你小看 puts 了,它虽然提高不了多少效率,但是能提高不少安全性。
严格地讲,如果需要 puts 的时候,你不用 puts 而用 printf,那么你应该这么写:
printf( "%s", string );
但是实际工作中很少见人 ...


printf( "%s", string );我一般不会这么写的。呵呵……不过我就是感觉用puts或者用printf都是很自然就用了,也没怎么考虑过到底用哪个更帅气些!不一般情况下如果需要format时就用printf,直接就是字符串时就自然用puts了。呵呵……

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2008-01-25 13:10 |只看该作者
原帖由 mingyanguo 于 2008-1-25 12:35 发表

没记错的话,printf那个问题只有在string是用户可构造的的情况下有问题吧,对于这些常量字符串,直接printf应该是没有问题的。

对。

论坛徽章:
0
10 [报告]
发表于 2008-01-25 13:15 |只看该作者
看来确实是这样的,常量用fputs输出,带格式控制字符的用printf来输出。

to flw
我没有废掉任何一个的意思,只是上来问一下。

to mingyanguo
请问您认为代码风格哪一个比较好?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP