免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-17 12:45 |显示全部楼层 |倒序浏览
我写了一个函数xxx_log ( const char *fmt,  ... ), 该函数一直表现良好,值得发奖状,但是今天,它给我背后下刀子了。。。

xxx_log ( "%s, %d i am a log. and a very long info.......\n"
  __FILE__, __LINE__ );

乍看上去这代码没有问题吧,编绎也没有任何警告和错误。我是开了Wall的。但是,程序一运行到这里就segment fault。我一步步调试,花了非常长的时间才发现我少写了一个“,”。这个项目我已经写了近一万行代码了,就漏了这一次。

怎么写才能避免这种情况再次出现????我要编绎的时候就能检查出来

论坛徽章:
0
2 [报告]
发表于 2009-03-17 12:52 |显示全部楼层
我认为肯定还会有其它的犯的   

论坛徽章:
0
3 [报告]
发表于 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
4 [报告]
发表于 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
5 [报告]
发表于 2009-03-18 09:16 |显示全部楼层
原帖由 flw 于 2009-3-17 14:15 发表
垃圾代码。
我从来不自己手敲 __FILE__, __LINE__,都是用宏自动扩展。


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP