请教大家一个c语言的宏定义的问题

2020-01-15 19:22发布

如下的宏定义:
#define ADD(a,b) a+b

c=ADD(a,b)*ADD(a++,++b);
是可以编译过去的,但是如果使用下面的公式则编译不过去
c=a+b*a+++++b;

个人理解使用宏展开后和上述公式应该是一致的啊,为啥一个可以编译过去,一个不可以?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
孤独的凯
1楼-- · 2020-01-16 01:22
本帖最后由 孤独的凯 于 2017-8-29 21:56 编辑

用gcc -E 试了下宏展开是 c=a+b*a+++ ++b;
中间有个空格第二个ADD展开的时候有空格
估计是编译器的原因
avr_sz
2楼-- · 2020-01-16 01:37
说明编译器比较智能,不只是简单的展开
wistarky
3楼-- · 2020-01-16 05:20
建议用
#define ADD(a,b) (a+b)
或者是
#define ADD(a,b) ((a)+(b))
jnck
4楼-- · 2020-01-16 07:50
 精彩回答 2  元偷偷看……
takashiki
5楼-- · 2020-01-16 12:30
建议楼主使用#define ADD(a, b) ((a) + (b))而不是别的,另外不要写下面的表达式,何必违反MISRA C给自己找麻烦。程序要求可读性、健壮性,不是用来显摆的。
takashiki
6楼-- · 2020-01-16 17:16
jnck 发表于 2017-8-30 03:05
这时对的,看过一本c语言书中就提到防止编译器展开出问题,宏定义一定要用括号分清楚 ...

你也知道宏定义要用括号分清楚,那么第一个方案就是错的。无法正确识别ADD(1<<2, 4>>1)的意图

一周热门 更多>