变参(不定参)的宏函数
来源:互联网 发布:淘宝店怎么经营 编辑:程序博客网 时间:2024/05/22 13:31
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/
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/
0 0
- 变参(不定参)的宏函数
- 宏函数的不定参
- 不定参数的宏 函数
- 代码测试----不定参函数
- 代码测试----不定参函数
- 不定参函数使用纪要
- 变参函数的实现
- 变参函数的实现
- 变参函数的实现
- 变参函数的实现
- 变参函数的实现
- 不定参宏
- 汇编:简约不简单的不定参函数实现方法
- 汇编:简约不简单的不定参函数实现方法
- 不定参的宏定义使用
- 不定参数委托调用定参函数
- 变参函数定义
- 变参函数设计
- Data Organization in InnoDB
- 设计模式自学-观察者模式
- 触摸屏信息亭的娱乐下载
- 1070954.1 :exachk
- 橙色旧金山 - 中兴通讯刀片Android智能手机
- 变参(不定参)的宏函数
- 分割图集成一张张小图
- Skia简介以及在Windows下编译操作步骤
- 初学者享受在魔兽世界与成功策略
- 全文本SDK与数据捕捉SDK比较
- 冲突战队作弊工具的Android IOS
- 冲突家族秘籍的Android没有调查没有密码
- 结构与指针
- 在xcode5中修改整个项目名