关于C语言中宏使用的苦恼......(是朋友就进来坐坐,急,高分相送)

dchg2000 2003-08-23 07:55:43
各位老兄好:
我现在的想法是用宏定义一个不定参数的函数,
方法:
#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) );

这个宏怎么写?大家发表意见!!!




...全文
34 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dchg2000 2003-08-25
  • 打赏
  • 举报
回复
非常感谢,受益匪浅!
zhutr 2003-08-24
  • 打赏
  • 举报
回复
RedHat 7.1(2.4.2-2)
编译通过!
zhutr 2003-08-24
  • 打赏
  • 举报
回复
试试这个,看看编译后的执行结果是你要求的功能吗?


#include <stdio.h>

#define errprint(err_in...) fprintf(stderr, err_in)

int
main()
{
unsigned char *errmsg = "this is a error print test!";

errprint("error = %s\n %d\n", errmsg, 10);
return(0);
}
zhutr 2003-08-24
  • 打赏
  • 举报
回复
一定要用两重括号的形式吗?
CoolQ 2003-08-24
  • 打赏
  • 举报
回复
应该是#define deg_printf(lin) fprintf(stderr, lin)
吧?
林雨亭 2003-08-24
  • 打赏
  • 举报
回复
忘了说明,第一种方法: ##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”
林雨亭 2003-08-24
  • 打赏
  • 举报
回复
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> %s, " #msg_fmt "\n", \
__FILE__, __LINE__, __PRETTY_FUNCTION__, \
"[" #expr "] False " , __VA_ARGS__ ); \
}
fierygnu 2003-08-24
  • 打赏
  • 举报
回复
可变参数宏是C99的新标准,现在可能只有gcc支持。原来的编译器只能支持两重括号的方式。
LeeZi 2003-08-23
  • 打赏
  • 举报
回复
#define deg_printf(lin) printf(stderr, lin)
dchg2000 2003-08-23
  • 打赏
  • 举报
回复
大家想办法呀!
dchg2000 2003-08-23
  • 打赏
  • 举报
回复
大家看看呀。。。。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧