Vision 发表于 2016-7-22 10:31:14

预编译问题

/*
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没有被替换,所以程序运行不正确。

请问为什么?怎么解决?

Vision 发表于 2016-7-22 12:42:04

搞了一个上午,终于弄明白了。

原因是C语言规定预编译器不置换双引号里的字符。
页: [1]
查看完整版本: 预编译问题