当前位置: 技术问答>linux和unix
日志打印接口 编译时出现:error: ‘va_start’ used in function with fixed args
来源: 互联网 发布时间:2017-04-07
本文导语: 现在 在写一个日志接口: 主要想采用vsnprintf 和va_start() 系统调用, 基本要实现类似下面的功能;但是每次日志打印testlog.c和TLOGDEBUG(),这些是日志接口的信息,而非调用接口处的文件和函数。 [debug][2013-04-09 14:18:...
现在 在写一个日志接口:
主要想采用vsnprintf 和va_start() 系统调用, 基本要实现类似下面的功能;但是每次日志打印testlog.c和TLOGDEBUG(),这些是日志接口的信息,而非调用接口处的文件和函数。
[debug][2013-04-09 14:18:20] [testlog.c:TLOGDEBUG():189]
出现上面情况主要是把__FILE__,__FUNCTION__,__LINE__封装到日志接口函数内部实现中,未了避免是上面情况,把__FILE__等信息作为入参传入日志接口中。先定义两个宏,但是编译时出现error: ‘va_start’ used in function with fixed args。不知道什么原因?大家请帮忙看下,对下面的定义,大家有什么好的想法可以绕过这个坑。
83 #define LOGDEBUG(File,Func,Line,fmt, ...) do {
84 va_list ap;
85 va_start(ap, fmt);
86 LOGFUNC(File, Func, Line,fmt,ap,Debug );
87 va_end(ap);
88 }
89 while(0)
90
91
92 #define TLOGDEBUG(fmt, ... )do {
93 LOGDEBUG(__FILE__,__FUNCTION__,__LINE__,fmt, ...);
94 }
95 while(0)
96
测试函数为:
int main()
{
16 TLOGDEBUG("firsstefadfoasdnf");
}
其中 LOGFUNC()函数是将buf写到文件中。
主要想采用vsnprintf 和va_start() 系统调用, 基本要实现类似下面的功能;但是每次日志打印testlog.c和TLOGDEBUG(),这些是日志接口的信息,而非调用接口处的文件和函数。
[debug][2013-04-09 14:18:20] [testlog.c:TLOGDEBUG():189]
出现上面情况主要是把__FILE__,__FUNCTION__,__LINE__封装到日志接口函数内部实现中,未了避免是上面情况,把__FILE__等信息作为入参传入日志接口中。先定义两个宏,但是编译时出现error: ‘va_start’ used in function with fixed args。不知道什么原因?大家请帮忙看下,对下面的定义,大家有什么好的想法可以绕过这个坑。
83 #define LOGDEBUG(File,Func,Line,fmt, ...) do {
84 va_list ap;
85 va_start(ap, fmt);
86 LOGFUNC(File, Func, Line,fmt,ap,Debug );
87 va_end(ap);
88 }
89 while(0)
90
91
92 #define TLOGDEBUG(fmt, ... )do {
93 LOGDEBUG(__FILE__,__FUNCTION__,__LINE__,fmt, ...);
94 }
95 while(0)
96
测试函数为:
int main()
{
16 TLOGDEBUG("firsstefadfoasdnf");
}
其中 LOGFUNC()函数是将buf写到文件中。
|
试试
#define TLOGDEBUG(fmt, ... )do {
LOGFUNC(__FILE__,__FUNCTION__,__LINE__,fmt, __VA_ARGS__);
}
while(0)
不用定义那个LOGDEBUG
#define TLOGDEBUG(fmt, ... )do {
LOGFUNC(__FILE__,__FUNCTION__,__LINE__,fmt, __VA_ARGS__);
}
while(0)
不用定义那个LOGDEBUG
|
宏的可变参数不是这么用的. 和函数的可变参数是不同的...
给楼主一个例子: 看看吧,
给楼主一个例子: 看看吧,
int log_open(const char *name);
void log_message(int priority ,const char* fmt, ...);
void log_trace(const char *file , int line , const char *func, const char * fmt ,...);
int log_close();
#define LOG_ERROR(fmt , args...)
log_message(LOG_PRI_ERROR, fmt, ##args)
#define LOG_WARN(fmt, args...)
log_message(LOG_PRI_WARN, fmt , ##args)
#define LOG_NOTICE(fmt , args...)
log_message(LOG_PRI_NOTICE, fmt , ##args)
#define LOG_DEBUG(fmt , args...)
log_message(LOG_PRI_DEBUG, fmt , ##args)
#define LOG_TRACE(fmt,args...)
log_trace(__FILE__ , __LINE__ , __FUNCTION__ , fmt ,## args)
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。