预编译问题
/*9.5请分析以下一组宏所定义的输出格式:
#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)
如果在程序中有以下的宏引用:
PR(d,x);
PRINT1(d,x);
PRINT2(d,x1,x2);
写出宏展开后的情况,并写出应输出的结果,设x=5,x1=3,x2=8。
*/
#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()
{
int x=5,x1=3,x2=8;
PR(d,x);
PRINT1(d,x);
PRINT2(d,x1,x2);
return 0;
}
/*
我的思路:
1、展开:
#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()
{
int x=5,x1=3,x2=8;
printf("x=%d\t",(x));
printf("x=%d\t",(x));putchar('\n')
printf("x1=%d\t",(x1)); printf("x2=%d\t",(x2));putchar('\n');
return 0;
}
2、输出分析:
x=5 x=5tab 回车换行
x1=3 x2=8tab 回车换行
*/
--------------------------------------------------------------------------------------------------------------
gcc预编译后的代码:
省略stdio.h的代码
int main()
{
int x=5,x1=3,x2=8;
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;
}
---------------------------------------------------------------------------------------------------------------
从代码可以看出双引号里面的value和format没有被替换,所以程序运行不正确。
请问为什么?怎么解决? 搞了一个上午,终于弄明白了。
原因是C语言规定预编译器不置换双引号里的字符。
页:
[1]