写一个带不定参数的宏函数
2011-03-14 21:51:42
1.可变的宏是具有不定参数的宏。这些参数用...代表,被保存到__VA_ARGS__中。他会在内部进行扩展。
#defien err(...) fprintf(stderr, __AV_ARGS__)
err("%s file total %dMB.\n", "hello.c", 2) ;
预处理后为: fprintf(stderr, %s file total %dMB.\n", "hello.c",2) ;
2.可变的宏可以包含命名参数(在...之前)如:
#define errout(a, b, ...) fprintf(stderr, "file %s |%d|\n",a,b); fprintf(stderr,__VA_ARGS__)
3.很多时候我们在调用程序出错时都需要输出带file带line的log。我们可能会这样写
if(err) fputs(stderr, %s file:|%d|: %s\n", __FILE__, __LINE__, error message) ;
但是我们发现输出错误所在的文件和行时都要写这两个宏变量很麻烦。我们需要的时自动把file和line加到错误信息中。那么我们用不定参数宏加一些小技巧搞定。
#define errout(...) _errout(__FILE__, __LINE__, __VA_ARGS__)
#define _errout(file, line, ...) fprintf(stderr, "File %s:|%d| \n", file, line) ;\
fprintf(stderr, __VA_ARGS__)
这样只需写入错误信息,file和line就会“自动”输出出来。
注意1 fmt... 必须带...要不然就不能给dbg传递不定参数, 编译器会认为宏dbg()是定参数的,
//2dbg()的定义不能带... 原因很简单你会在printf()最后加...吗?
#define dbg(log_level, fmt...) kickstart(log_level, _FUNCTION, _LINE, fmt)
void
kickstart(int log_level, const char *func_name, int line_number, const char *format, ...)
{
;
}
dbg(x, y, z, q, 1, 3 ,4) ;
说明:
对编译器有要求,c99支持,g++不支持,
参考文章:http://www.jeffhung.net/blog/articles/jeffhung/1013/
#defien err(...) fprintf(stderr, __AV_ARGS__)
err("%s file total %dMB.\n", "hello.c", 2) ;
预处理后为: fprintf(stderr, %s file total %dMB.\n", "hello.c",2) ;
2.可变的宏可以包含命名参数(在...之前)如:
#define errout(a, b, ...) fprintf(stderr, "file %s |%d|\n",a,b); fprintf(stderr,__VA_ARGS__)
3.很多时候我们在调用程序出错时都需要输出带file带line的log。我们可能会这样写
if(err) fputs(stderr, %s file:|%d|: %s\n", __FILE__, __LINE__, error message) ;
但是我们发现输出错误所在的文件和行时都要写这两个宏变量很麻烦。我们需要的时自动把file和line加到错误信息中。那么我们用不定参数宏加一些小技巧搞定。
#define errout(...) _errout(__FILE__, __LINE__, __VA_ARGS__)
#define _errout(file, line, ...) fprintf(stderr, "File %s:|%d| \n", file, line) ;\
fprintf(stderr, __VA_ARGS__)
这样只需写入错误信息,file和line就会“自动”输出出来。
注意1 fmt... 必须带...要不然就不能给dbg传递不定参数, 编译器会认为宏dbg()是定参数的,
//2dbg()的定义不能带... 原因很简单你会在printf()最后加...吗?
#define dbg(log_level, fmt...) kickstart(log_level, _FUNCTION, _LINE, fmt)
void
kickstart(int log_level, const char *func_name, int line_number, const char *format, ...)
{
;
}
dbg(x, y, z, q, 1, 3 ,4) ;
说明:
对编译器有要求,c99支持,g++不支持,
参考文章:http://www.jeffhung.net/blog/articles/jeffhung/1013/