error: 'va_start' used in function with fixed args
场景:日记打印接口 编译时出现:error: ‘va_start’ used in function with fixed args
日志打印接口 编译时出现:error: ‘va_start’ used in function with fixed args
现在 在写一个日志接口:
主要想采用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
------解决方案--------------------
宏的可变参数不是这么用的. 和函数的可变参数是不同的...
给楼主一个例子: 看看吧,
日志打印接口 编译时出现:error: ‘va_start’ used in function with fixed args
现在 在写一个日志接口:
主要想采用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
------解决方案--------------------
宏的可变参数不是这么用的. 和函数的可变参数是不同的...
给楼主一个例子: 看看吧,
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)