自定义打印功能_TIME_,__ FILE __,__ FUNCTION __,_ _ _ ____

时间:2014-03-06 01:37:30

标签: c gcc gcc4.6

我在 debug.h

中有以下代码
#ifndef __DEBUG_H__
#define __DEBUG_H__

#ifdef DEBUG

int al_debug(const char *format,
        const char * time,
        const char * file,
        const char * function,
        int line,
        ...);
#define debug(fmt, args...) al_debug(fmt, __TIME__, __FILE__, __FUNCTION__, __LINE__, args...)
#else /* IF DEBUG NOT DEFINED*/
#define debug(fmt, ...) /* DO NOT PRINT ANYTHING IF DEBUG IS NOT PRESENT */
#endif /* END OF DEBUG */

#endif /* END OF __DEBUG_H__ */

debug.c

#include <stdarg.h>                                                     
#include <string.h>                                                     

#define __WRAP_FUNCTION__                                               
#include "debug.h"                                                      

#ifdef DEBUG   

int debug(const char *format,                                           
        const char * time,                                              
        const char * file,                                              
        const char * function,                                          
        int line,                                                       
        ...)                                                            
{                                                                       
    int done=0;                                                         
    va_list arg;                                                        
    va_start(arg, format);                                              
    done = vfprintf(stdout, "%s :%s:%s:%d", time, file, function, line);
    done += vfprintf(stdout, format, arg);                              
    va_end(arg);                                                        

    return done;                                                        
}           
#endif 

编译完成后,我遇到了以下错误:

gcc -g -Wall -DDEBUG -c debug.c -o d_debug.o
debug.c:16:1: error: expected declaration specifiers or ‘...’ before string constant
debug.c:16:1: error: expected declaration specifiers or ‘...’ before string constant
debug.c:11:5: error: expected declaration specifiers or ‘...’ before ‘__FUNCTION__’
debug.c:16:1: error: expected declaration specifiers or ‘...’ before numeric constant

我如何解决这个问题?这有什么问题?提前谢谢。

2 个答案:

答案 0 :(得分:1)

1)更改功能名称

// int debug(
int al_debug(

2)使用常规fprintf()

// done = vfprintf(stdout, "%s :%s:%s:%d", time, file, function, line);
done = fprintf(stdout, "%s :%s:%s:%d", time, file, function, line);

3)从line开始。在...

之前使用参数
// va_start(arg, format);
va_start(arg, line);

4)迂腐:添加done检查&lt;每次打印后都为0。

done = fprintf(stdout, "%s :%s:%s:%d", time, file, function, line);
if (done >= 0) {
  int done_former = done
  done = vfprintf(stdout, format, arg);
  if (done >= 0) done += done_former;
  }
va_end(arg);
return done;

5)将args...)更改为args) @leeduhem

[编辑]在格式化后使用无参数。

int al_debug(const char * time, const char * file, const char * function,
        int line, const char *format, ...);
#define debug(...) al_debug(__TIME__, __FILE__, __func__, __LINE__, __VA_ARGS__)
// @leeduhem for __VA_ARGS__
#else /* IF DEBUG NOT DEFINED*/
#define debug(...) /* DO NOT PRINT ANYTHING IF DEBUG IS NOT PRESENT */
#endif /* END OF DEBUG */

int al_debug(const char * time, const char * file, const char * function,
        int line, const char *format, ...) {
  int done = 0;
  va_list arg;
  va_start(arg, format);  // change to `format`
  ...

答案 1 :(得分:1)

修正版:

debug.h

#ifndef __DEBUG_H__
#define __DEBUG_H__

#ifdef DEBUG

int al_debug(const char *time, const char *file, const char *func, int line, const char * format, ...);
#define debug(...) al_debug(__TIME__, __FILE__, __func__, __LINE__, __VA_ARGS__)
#else /* IF DEBUG NOT DEFINED*/
#define debug(...) /* DO NOT PRINT ANYTHING IF DEBUG IS NOT PRESENT */
#endif /* END OF DEBUG */

#endif /* END OF __DEBUG_H__ */

debug.c

#include <stdio.h>
#include <stdarg.h>                                                     
#include <string.h>                                                     

#define __WRAP_FUNCTION__                                               
#include "debug.h"                                                      

#ifdef DEBUG   

int al_debug(const char *time, const char *file, const char *func, int line, const char *format, ...)
{                                                                       
    int done=0;                                                         
    va_list arg;                                                        
    va_start(arg, format);                                              
    done = fprintf(stdout, "%s :%s:%s:%d: ", time, file, func, line);
    done += vfprintf(stdout, format, arg);                              
    va_end(arg);                                                        

    return done;                                                        
}           
#endif

test.c

#include <stdio.h>
#include <stdlib.h>

#include "debug.h"

void foo(void)
{
    debug("debugg...\n");
    debug("%s and %d\n", "debug information", 42);
}

int
main(int argc, char *argv[])
{
    foo();

    exit(EXIT_SUCCESS);
}

测试:

$ gcc -g -Wall -I. -DDEBUG  debug.c test.c 
test.c: In function ‘main’:
test.c:12:10: warning: unused parameter ‘argc’ [-Wunused-parameter]
test.c:12:22: warning: unused parameter ‘argv’ [-Wunused-parameter]
$ ./a.out 
10:46:40 :test.c:foo:8: debugg...
10:46:40 :test.c:foo:9: debug information and 42

$ gcc -g -Wall -I.   debug.c test.c 
test.c: In function ‘main’:
test.c:12:10: warning: unused parameter ‘argc’ [-Wunused-parameter]
test.c:12:22: warning: unused parameter ‘argv’ [-Wunused-parameter]
$ ./a.out 
$ 

一些可能有用的链接:

6.20 Macros with a Variable Number of Arguments
6.47 Function Names as Strings