• 全部
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux
  • 问答

关于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) );

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




...全文
8 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
大家看看呀。。。。
回复
相关推荐
发帖
Linux/Unix社区
创建于2007-08-27

2.0w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
帖子事件
创建了帖子
2003-08-23 07:55
社区公告
暂无公告