/*
三个点 ... (C语言变参)
如果是是形参里面出现,表示的是可变参数,即表示的传入的参数个数是可变,传多少个参数都被放到一个数组里面
C语言预处理器定义的一些宏 :
__LINE__ 当时行号(预处理器正在执行的那一时刻),十进制数
__FUNCTION__ 当时函数,字符串
__FILE__ 当时文件,字符串
__DATE__ 当时日期,字符串
__TIME__ 当时时间,字符串
__VA_ARGS__ 指打印宏里面的可变参数,也就是函数参数里面的...
*/
#define DEBUG
#ifdef DEBUG
#define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
#else
#define DBG(...)
#endif
int main(void)
{
DBG("tiaoshi.\n");
return 0;
}
/*
内核中的DEBUG宏
#ifdef DEBUG_S3C_MEM
#define DEBUG(fmt, args…) printk(fmt, ##args)
#else
#define DEBUG(fmt, args…) do {} while (0)
#endif
args…其实代表可变参数的意思,参数可以是零个,例如在使用时,可以如一下方式:
#define PRINT_DEBUG(fmt,args…) do{ if(a>b) {printf(fmt,##args); } }while(0)
PRINT_DEBUG(“hello word\n”);
PRINT_DEBUG("%s\n",“hello word”);
PRINT_DEBUG("%s %s\n",“hello”," word");
为何是“#define debug(fmt,args…) printf (fmt ,##args)”这种宏定义方式呢?
<1> #define debug(fmt,args) printf (fmt ,##args)
当不定参数多于1个,会提示参数多于agrs对应的参数
<2> #define debug(fmt,…) printf (fmt ,##args)
这种情况agrs找不到对应项
<3> #define debug(fmt,…) printf (fmt ,…)
这种情况下,不定参数在预编译时全部被替换成“…”
<4> #define debug(fmt,args…) printf (fmt ,args)
我测试了,也是可以的
<5> #define debug(fmt,args) printf (fmt ,##args)
u-boot使用的方法
*/