免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 我learnc
打印 上一主题 下一主题

[函数] 可变参数伤害了我,怎么避免这种情况? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-03-17 17:01 |只看该作者
原帖由 xiaoQ008 于 2009-3-17 14:33 发表
楼主, 既然你实现了可变参数的函数 可否共享下你的一点点代码
我看过printf的大概实现
应该是通过第一个参数的%d %f %s等
通过一个switch语句
让后用第一个参数的地址 再加上+4(对应%d)+or8(对应%f)等 来寻 ...

楼主应该用的vfprintf之类的函数了
兄弟,你还是自己看看printf的代码吧

论坛徽章:
0
12 [报告]
发表于 2009-03-17 17:35 |只看该作者
楼主的变参可以支持0个变参么,,好比如printf()函数可以带0个变参输出:
printf("format");
呵呵

论坛徽章:
0
13 [报告]
发表于 2009-03-18 08:41 |只看该作者
原帖由 maxxfire 于 2009-3-17 17:35 发表
楼主的变参可以支持0个变参么,,好比如printf()函数可以带0个变参输出:
printf("format");
呵呵

如果是调用vprintf显然可以
自己实现应该也可以

论坛徽章:
0
14 [报告]
发表于 2009-03-18 09:09 |只看该作者
原帖由 xiaoQ008 于 2009-3-17 14:33 发表
楼主, 既然你实现了可变参数的函数 可否共享下你的一点点代码
我看过printf的大概实现
应该是通过第一个参数的%d %f %s等
通过一个switch语句
让后用第一个参数的地址 再加上+4(对应%d)+or8(对应%f)等 来寻 ...



像楼上所说的,我是用
va_start
va_end
vsnprintf 实现对可变参数进行处理的,
man va_start 就可以知道了。

论坛徽章:
0
15 [报告]
发表于 2009-03-18 09:14 |只看该作者
原帖由 akunspy 于 2009-3-17 13:04 发表
void xxx_log( const char *fmt, ... ) __attribute__((format(printf,1,2)));  这样声明函数,编译时加-Wall参数,这种情况就会给你警告了.
另外,这种问题至于一步步找很久么...挂的时候,加载CORE DUMP看调用栈 ...


谢谢。 我是LINUX编程的,算新手吧,这是我做的第一个LINUX下的项目。

论坛徽章:
0
16 [报告]
发表于 2009-03-18 09:16 |只看该作者
原帖由 flw 于 2009-3-17 14:15 发表
垃圾代码。
我从来不自己手敲 __FILE__, __LINE__,都是用宏自动扩展。


论坛徽章:
0
17 [报告]
发表于 2009-03-18 09:31 |只看该作者
原帖由 gawk 于 2009-3-18 08:41 发表

如果是调用vprintf显然可以
自己实现应该也可以


是可以,但是这样定义宏的话:xxx_log ( const char *fmt,  ... );
代码中若这样调用:xxx_log("test");   由于fmt后面有个逗号是编译不过去的。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP