免费注册 查看新帖 |

Chinaunix

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

阅读 wget 源代码中的一个问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-09 12:58 |只看该作者 |倒序浏览
在wget程序中,函数定义经常使用 PARAMS 参数。
比如:


  1. #ifndef INIT_H
  2. #define INIT_H

  3. void initialize PARAMS ((void));
  4. int parse_line PARAMS ((const char *, char **, char **));
  5. int setval PARAMS ((const char *, const char *));
  6. char *home_dir PARAMS ((void));
  7. void cleanup PARAMS ((void));

  8. #endif /* INIT_H */

复制代码


它的定义如下:



  1. #ifndef PARAMS
  2. # if PROTOTYPES
  3. #  define PARAMS(args) args
  4. # else
  5. #  define PARAMS(args) ()
  6. # endif
  7. #endif
复制代码



我对这个定义很不理解,大家解释一下吧。[/code]

论坛徽章:
0
2 [报告]
发表于 2005-08-09 16:34 |只看该作者

阅读 wget 源代码中的一个问题。

以setval函数的声明来说,在ANSI C中应该是
int setval (const char *, const char *);

而在以前的K&R C语法中,应该是
int setval();

有些老的编译器只能识别K&R C的语法,wget中定义的PARAMS
就是为了使代码在这些编译器上也能成功编译

论坛徽章:
0
3 [报告]
发表于 2005-08-09 17:29 |只看该作者

阅读 wget 源代码中的一个问题。

原帖由 "zearth" 发表:
以setval函数的声明来说,在ANSI C中应该是
int setval (const char *, const char *);

而在以前的K&R C语法中,应该是
int setval();

有些老的编译器只能识别K&R C的语法,wget中定义的PARAMS
就是为了使..........



用于和早期的C编译器兼容。早期的C编译器没有函数原型这个概念,因此对于函数声明的参数表都是空的,到了后期的C编译器以及C++编译器都要求使用完整的函数原型,那么参数表就不能是空的了。

这里如果定义了宏PROTOTYPES,则表示使用新的函数原型,那么一个函数声明:

extern int func PROTO_LIST((int, void *));

就被扩展成:

extern int func (int, void *);

注意PROTO_LIST中应该有两层括号,否则函数参数会被认为是宏参数而出错。

如果没有定义PROTOTYPES,那么上面的函数声明就被扩展成:

extern int func ();

由此符合早期C编译器的要求。

论坛徽章:
0
4 [报告]
发表于 2005-08-09 17:43 |只看该作者

阅读 wget 源代码中的一个问题。

libc好多这样转来转去的宏定义,让人糊涂……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP