- 论坛徽章:
- 0
|
各位大虾们:
小弟在做开发时候遇到一个说大不大,说小不小的问题,请赐教!
项目里有个记日志的函数,使用了可变参数,原型如下:
int MyLog( char *logname, char *format, ... );
logname:日志文件名
format:格式输入
... :变参输出
使用方法如下:
MyLog( "myserver", "run server @ [%d].pid[%d]\n", time(0), getpid() );
我遇到的问题是,有时候我参数输入不对,例如可能会写成如下:
MyLog( "myserver", "server name [%s]" ); /*漏写了一个参数 */
MyLog( "myserver", "server name [%s]" , getpid()); /*参数不匹配 */
这样程序在运行的时候可能会core出来。
所以我希望在编译的时候就能把这些问题发现。而这些函数在编译的时候如果参数输入错误不会报警告,
这让我觉得很不方便。而小弟发现gcc编译器printf格式输出的时候,如果参数输入错,编译器会警告;所以我的想法
是把MyLog通过宏定义转为printf,MyLog比printf多了一个logname的参数,因此小弟尝试如下操作:
------------------------------------ 方法一 -----------------------------------------------------
#define MyLog(a,b,...) printf( b, ... )
这样去掉了第一个参数!
但是这样的变参宏定义,编译器是不支持的!郁闷!
------------------------------------ 方法二 -----------------------------------------------------
另外一个方法是把MyLog的第一个参数去掉,
例如MyLog( "myserver", "server name [%s]" ); /*漏写了一个参数 */
转为printf( "server name [%s]" );
这样能把错误都发现,但是要在每个日志输出的地方都要改程序代码,工作量太大!
小弟想要的答案是:
(1)方法一中,有没有宏定义的其他技巧,把 MyLog(a,b,...) 转为printf(b,...) ?
(2)如果采用第二种方法,如何使用sed批量修改日志,例如我有如下的使用在server.c文件中
----server.c----
int main(int argc,char **argv)
{
MyLog( "myserver", "server name [%s]" ); /*漏写了一个参数 */
MyLog( "myserver", "server name [%s]" , getpid()); /*参数不匹配 */
}
使用sed如何去掉转化为如下:
int main(int argc,char **argv)
{
printf( "server name [%s]" ); /*漏写了一个参数 */
printf( "myserver", "server name [%s]" , getpid()); /*参数不匹配 */
}
谢谢!!!!!!!!!!! |
|