当前位置:  技术问答>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写到文件中。

|
试试

  #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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • python异常信息堆栈输出到日志文件
  • linux下系统日志 操作日志 告警日志怎么存储啊?
  • 不同版本MSSQL清除日志方法介绍
  • solaris的系统日志文件叫什么名字?在什么目录下??如何打开/关闭系统日志????
  • Docker支持更深入的容器日志分析
  • 如何关闭red hat 7.3的核心日志和系统日志
  • ubuntu查看系统日志及相关文件介绍
  • 请问程序的日志重定向到别日志文件,系统会对该日志文件的大小作限制么
  • docker源码分析之容器日志处理与log-driver实现
  • 用shell如何获取一个日志中某个时间段的日志
  • c#实现把异常写入日志示例(异常日志)
  • sql server日志收缩脚本及解决日志增长过快的问题
  • 我通过C程序执行tail -f printlog(printlog为日志名),想要动态获取里面新进来的日志,怎么办?
  • 多进程输出日志,用什么方式保存日志效率比较高?
  • jquery iis7站长之家
  • apache使用日志分割模块rotatelogs分割日志详解
  • mysql日志文件在哪 如何修改MySQL日志文件位置
  • 删除sqlserver数据库日志和没有日志的数据库恢复办法
  • (答者给分)crontab 定时执行sh 日志显示发送mail 如何查看错误日志
  • java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)
  • 日志分析软件 Splunk


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,