有关一道宏定义的题的疑问

sunyuqian 2008-07-17 05:05:29
大家好,我在看这道题时有个疑问,用/*...*/表出,请高手指教

//分析宏定义的输出格式
#include <Stdio.h>
#define NL putchar('\n')
#define PR(format,value) printf("value=%format\t",(value))
#define PRINT1(f,x1) PR(f,x1);NL
#define PRINT2(f,x1,x2) PR(f,x1);PRINT1(f,x2)
void main()
{
float x=5.0,x1=3.0,x2=8.0;
//char d='f';
PR(d,x);/*我已经将上面那行注释了,d就没有定义过了,但为什么还能正常运行,我又把d换成其它字母,依然可以运行*/
PRINT1(d,x);
PRINT2(d,x1,x2);
}
//在宏替换时对字符串中的字符不与替换,保留原状
...全文
127 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyuqian 2008-07-17
  • 打赏
  • 举报
回复
谢谢了
Maxwell 2008-07-17
  • 打赏
  • 举报
回复
那是因为你用了%d但是给它传了一个double型的变量。要是改成f就没问题了。
sunyuqian 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 k2eats 的回复:]
你应该使用:

C/C++ code
//分析宏定义的输出格式
#include <Stdio.h>
#define NL putchar('\n')
#define PR(format,value) printf("value=%"#format"\t",(value))//使用#连接!!!!!!!!!!!
#define PRINT1(f,x1) PR(f,x1);NL
#define PRINT2(f,x1,x2) PR(f,x1);PRINT1(f,x2)
int main()
{
float x=5.0,x1=3.0,x2=8.0;
char d='f';
PR(d,x);/*我已经将上面那行注释了,d就没有定义过了,但为…
[/Quote]


#define PR(format,value) printf("value=%"#format"\t",(value))//使用#连接!!!!!!!!!!!

按照这么写的话得数全是0,是不是哪还有错
Maxwell 2008-07-17
  • 打赏
  • 举报
回复
PR是个宏,宏的参数不要求是变量。
lll111jjj 2008-07-17
  • 打赏
  • 举报
回复
不是蛮懂。不过我试了的,替换时对字符和字符串都不管用。
期待高手的回答。
Maxwell 2008-07-17
  • 打赏
  • 举报
回复
#define PR(format,value) printf("value=%" format "\t",(value))
用PR("f", x)调用。
或者写成#define PR(format,value) printf("value=%" #format "\t",(value))
用你原来的方式去调用。
最好仔细理解一下宏定义是什么。
sunyuqian 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 coverallwangp 的回复:]
printf("value=%format\t",(value))
你这里的%f被看做了格式,而不是你的d
所以你注释掉也照样运行
[/Quote]

可是,如果没对变量定义类型,C语言应该报没有定义之类的错啊
//char d='f';
PR(d,x);
d没有定义过,为什么就不错呢

#define PR(format,value) printf("value=%format\t",(value))
PR里有2个参数,在main()函数里应该也写含两个参数的PR()方法,可PR(d,x);里的d没定义,应该抱错啊
K行天下 2008-07-17
  • 打赏
  • 举报
回复
你应该使用:

//分析宏定义的输出格式
#include <Stdio.h>
#define NL putchar('\n')
#define PR(format,value) printf("value=%"#format"\t",(value))//使用#连接!!!!!!!!!!!
#define PRINT1(f,x1) PR(f,x1);NL
#define PRINT2(f,x1,x2) PR(f,x1);PRINT1(f,x2)
int main()
{
float x=5.0,x1=3.0,x2=8.0;
char d='f';
PR(d,x);/*我已经将上面那行注释了,d就没有定义过了,但为什么还能正常运行,我又把d换成其它字母,依然可以运行*/
PRINT1(d,x);
PRINT2(d,x1,x2);
}
//在宏替换时对字符串中的字符不与替换,保留原状

ForestDB 2008-07-17
  • 打赏
  • 举报
回复

$ cat main.c
#define NL putchar('\n')
#define PR(format,value) printf("value=%format\t",(value))
#define PRINT1(f,x1) PR(f,x1);NL
#define PRINT2(f,x1,x2) PR(f,x1);PRINT1(f,x2)

int main()
{
float x=5.0,x1=3.0,x2=8.0;
PR(d,x);
PRINT1(d,x);
PRINT2(d,x1,x2);

return 0;
}

$ gcc -E main.c
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "main.c"





int main()
{
float x=5.0,x1=3.0,x2=8.0;
printf("value=%format\t",(x));
printf("value=%format\t",(x));putchar('\n');
printf("value=%format\t",(x1));printf("value=%format\t",(x2));putchar('\n');

return 0;
}
xkyx_cn 2008-07-17
  • 打赏
  • 举报
回复
#define PR(format,value) printf("value=%format\t",(value))
这个宏与 format 没有关系
ChamPagneZ 2008-07-17
  • 打赏
  • 举报
回复
PR(d,x)
printf("x=%d\t",(x));//为什么不能运行?
宏只会替代,不会检查d是否是个变量或者其他...
K行天下 2008-07-17
  • 打赏
  • 举报
回复
哦,你没有采用宏连接, 是一楼上所说!
K行天下 2008-07-17
  • 打赏
  • 举报
回复
/*我已经将上面那行注释了,d就没有定义过了,但为什么还能正常运行,我又把d换成其它字母,依然可以运行*/
这样就变成了:
#define PR(format,value) printf("value=%format\t",(value))

printf("value=%d\t",(x))
%d正好打印整数!!
coverallwangp 2008-07-17
  • 打赏
  • 举报
回复
printf("value=%format\t",(value))
你这里的%f被看做了格式,而不是你的d
所以你注释掉也照样运行

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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