引用互联网的资料,首先介绍几个宏:
1) __VA_ARGS__ 是一个可变参数的宏。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的”,”去掉的作用,否则会编译出错。
2) __FILE__ 宏在预编译时会替换成当前的源文件名
3) __LINE__宏在预编译时会替换成当前的行号
4) __FUNCTION__宏在预编译时会替换成当前的函数名称
#define ERRMSG1(fmt,…) sprintf(m_errMsg, fmt, ##__VA_ARGS__) //按一定格式将字符串放入m_errMsg,使用例子:ERRMSG1(“[debug]i=%d”,i);
#define ERRMSG2(fmt,args…) sprintf(m_errMsg, “[%s 第 %d 行 ]; “fmt”\r\n” , __FILE__, __LINE__, ##args) //将固定格式的字符串格式化到m_errMsg,将生成“[sqliteHelper.c第2行];”的固定格式,fmt会按args去格式化。
参考:
- http://blog.chinaunix.net/uid-22878837-id-2110544.html
- http://bbs.csdn.net/topics/390755688