C语言宏问题

#include "stdio.h"
#define X(a,b,c) (1.0/2)*(a+b+c)
#define S X(a,b,c)
#define AREA(a,b,c) sqrt(S*(S-a)*(S-b)*(S-c))

#include <stdio.h>
#include <math.h>

int main()
{
int e,f,g;
printf("请输入三角形的三条边:\n");
printf("第一条边:");
scanf("%d",&e);
printf("第二条边:");
scanf("%d",&f);
printf("第三条边:");
scanf("%d",&g);
printf("该三角形的面积是:%f",AREA(e,f,g));
printf("\n");
return 0;
}
哪里错了?为什么?
谢谢你们的回答,可是我就是为了省去写X(a,b,c)才又定义了一个S的,这是做的谭浩强那本书上的宏那章的一个练习,书上不是也可以用宏再定义宏的吗?为什么我这样用就不行?书上一个例子:

#include "stdio.h"
#define PI 3.1415926
#define S(r) PI*r*r
main()
{
float a,area;
a = 3.6;
area = S(a);
printf("r=%f\narea=%f\n",a,area);
}

其中不是也用变量a去替换宏S(r)的参数r了吗?为什么我的程序里再替换一次就不行呢?想不通

那是不是这样理解:

先执行printf("该三角形的面积是:%f",AREA(e,f,g)); 这句时将AREA(e,f,g)替换成sqrt(S*(S-e)*(S-f)*(S-g)),然后再将sqrt(S*(S-e)*(S-f)*(S-g))中的S替换时没有传入相应的a,b,c所有说没找到.
对吧?

但是,预编译是不是按语句的顺序进行的啊?如果是的话,那就应该先把#define AREA(a,b,c) sqrt(S*(S-a)*(S-b)*(S-c)) 句替换成#define AREA(a,b,c) sqrt(X(a,b,c)*(X(a,b,c)-a)*(X(a,b,c)-b)*(X(a,b,c)-c)) 句,不是吗?那主程序里再替换就不会出错了吧?呵呵,麻烦了

谁知道编译预处理的原理?关于宏的?谢谢

这个是滥用宏定义的问题.
在程序运行到printf("该三角形的面积是:%f",AREA(e,f,g)); 这里时,AREA是可以认知的相当与sqrt(S*(S-e)*(S-f)*(S-g)) ,但是它里面的S并不认知,再次调用宏替换到X(a,b,c)时,这里的#define X(a,b,c) (1.0/2)*(a+b+c)程序不能认知它,因此编译会提示说a,b,c未声明的标示符.

如果你非要使用宏来处理这个问题,建议你将实参也用a,b,c.
将#define S X(a,b,c) 屏掉再替换AREA的宏
#define AREA(a,b,c) sqrt(X(a,b,c)*(X(a,b,c)-a)*(X(a,b,c)-b)*(X(a,b,c)-c)) 也可以处理

希望对你有用!

补充:#define PI 3.1415926
#define S(r) PI*r*r
这里的PI是宏常量,并没涉及传入参数啊,你上面那样写会导致未知参数的错误.宏常量就是替换下字符而已.而X(a,b,c)相当于调用
理解!理解!

对于参数的替换倒不用,形参和实参不一定要统一的标示符!
换成a,b,c编译是没问题,但可以有更好的办法定义这些.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-06-01
#define X(a,b,c) (1.0/2)*(a+b+c)
#define AREA(a,b,c) sqrt(X(a,b,c)*(X(a,b,c)-a)*(X(a,b,c)-b)*(X(a,b,c)-c))
把S那行去掉;
第2个回答  2007-06-01
#define 只是简单的宏定义,简单的替换.

对于你这道题,把主函数中的e,f,g分别改成a,b,c就对了.
第3个回答  2007-06-04
把主函数中的e,f,g分别改成a,b,c就对了.
第4个回答  2007-06-04
看不懂
相似回答