变长参数宏 不定参数宏

变长参数宏类似printf的参数,后面参数个数可以不确定.这样可以写出比较复杂的宏,主要用于调试语句。 对于变长参数宏的支持,不同编译器有不同支持。VC++ 7.0 (VS.net)前不支持把宏的变长参数.只支持变长参数的函数设计.换句话说宏中不能出现…。在 GNU C 中gcc 支持的形式比较灵活,宏体即可以是函数,也可以是语句块.变长参数宏一大应用就是调试输出宏.在需要调试时打开调试宏,发行时只要简单关闭调试宏,则完全从程序中移走。 gcc的变长宏的用法 变长宏在宏名中用arg…表示,在宏体用##arg表示。如: #define OS_LOG(fmt,arg…) printf(fmt,##arg),则使用OS_LOG可用变长参数,如下列形式均可OS_LOG(“%s”,”hxy”); OS_LOG(“%d,%d”,1,2);又如#define pr_debug(fmt,arg...) / printk(KERN_DEBUG fmt,##arg)。 C99编译器标准允许定义可变参数宏(variadic macros),这样就可以使用拥有可以变化的参数表的宏。可变参数宏就像下面这个样子: #define debug(…) printf(__VA_ARGS__),缺省号代表一个可以变化的参数表。使用保留名 __VA_ARGS__ 把参数传递给宏。当宏的调用展开时,实际的参数就传递给 printf()了。例如:Debug(“Y = %d/n”, y);而处理器会把宏的调用替换成:printf(“Y = %d/n”, y); 因为debug()是一个可变参数宏,你能在每一次调用中传递不同数目的参数: debug(“test”); //一个参数。 可变参数宏不被ANSI/ISO C++ 所正式支持。 用GCC和C99的可变参数宏, 更方便地打印调试信息: #ifdef DEBUG #define dbgprint(format,args...) / fprintf(stderr, format, ##args) #else #define dbgprint(format,args...) #endif 如此定义之后,代码中就可以用dbgprint了,例如dbgprint("aaa %s", __FILE__);

 

 

  4 #ifndef DEBUG

  5 #define DEBUG 1

  6 #define debug(fmt,arg...) {if(DEBUG == 0)printf("DEBUG==0" fmt,##arg);/

  7                            else if(DEBUG==1) printf("DEBUG==1" fmt,##arg    );/

  8                            else ;/

  9                            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值