当前位置: 技术问答>linux和unix
关于C语言中宏使用的苦恼......(是朋友就进来坐坐,急,高分相送)
来源: 互联网 发布时间:2015-04-10
本文导语: 各位老兄好: 我现在的想法是用宏定义一个不定参数的函数, 方法: #define deg_printf(lin) printf lin 在应用中应用: deg_printf( ("this is no %d", n) ); 它等价于 printf ("this is no %...
各位老兄好:
我现在的想法是用宏定义一个不定参数的函数,
方法:
#define deg_printf(lin) printf lin
在应用中应用:
deg_printf( ("this is no %d", n) );
它等价于
printf ("this is no %d", n);
我现在的想法,是想把他输出到错误终端,
谁用好的想法??
不想这样: deg_printf( (stderr, "this is no %d", n) );
想这样: err_printf( ("this is no %d", n) );
这个宏怎么写?大家发表意见!!!
我现在的想法是用宏定义一个不定参数的函数,
方法:
#define deg_printf(lin) printf lin
在应用中应用:
deg_printf( ("this is no %d", n) );
它等价于
printf ("this is no %d", n);
我现在的想法,是想把他输出到错误终端,
谁用好的想法??
不想这样: deg_printf( (stderr, "this is no %d", n) );
想这样: err_printf( ("this is no %d", n) );
这个宏怎么写?大家发表意见!!!
|
试试这个,看看编译后的执行结果是你要求的功能吗?
#include
#define errprint(err_in...) fprintf(stderr, err_in)
int
main()
{
unsigned char *errmsg = "this is a error print test!";
errprint("error = %sn %dn", errmsg, 10);
return(0);
}
#include
#define errprint(err_in...) fprintf(stderr, err_in)
int
main()
{
unsigned char *errmsg = "this is a error print test!";
errprint("error = %sn %dn", errmsg, 10);
return(0);
}
|
gcc 自己支持一种方式
#define assert_msg( msg, args... )
{
printf("%s:%d:MESSAGE:"#msg"n",
__FILE__, __LINE__, ##args );
}
然后C99 提供另一种方式,gcc 同样支持
#define assert_msg(expr, msg_fmt, ... )
if( !( expr ) )
{
printf("%s:%d:ASSERT: %s, " #msg_fmt "n",
__FILE__, __LINE__, __PRETTY_FUNCTION__,
"[" #expr "] False " , __VA_ARGS__ );
}
#define assert_msg( msg, args... )
{
printf("%s:%d:MESSAGE:"#msg"n",
__FILE__, __LINE__, ##args );
}
然后C99 提供另一种方式,gcc 同样支持
#define assert_msg(expr, msg_fmt, ... )
if( !( expr ) )
{
printf("%s:%d:ASSERT: %s, " #msg_fmt "n",
__FILE__, __LINE__, __PRETTY_FUNCTION__,
"[" #expr "] False " , __VA_ARGS__ );
}
|
可变参数宏是C99的新标准,现在可能只有gcc支持。原来的编译器只能支持两重括号的方式。
|
忘了说明,第一种方法: ##args 就是可变参数
第二种方法,__VA_ARGS__ 是可变参数,
参考文献:
《The GNU C Library Reference Manual》Sandra Loosemore with Richard
M.Stallman, Roland McGrath ,Andrew Oram, Ulrich Drepper 著
ISO/IEC 9899:1999 (E): C Standard,简称“C99”
第二种方法,__VA_ARGS__ 是可变参数,
参考文献:
《The GNU C Library Reference Manual》Sandra Loosemore with Richard
M.Stallman, Roland McGrath ,Andrew Oram, Ulrich Drepper 著
ISO/IEC 9899:1999 (E): C Standard,简称“C99”