wswh2o 发表于 2017-8-29 21:40:27

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

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

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

个人理解使用宏展开后和上述公式应该是一致的啊,为啥一个可以编译过去,一个不可以?

孤独的凯 发表于 2017-8-29 21:54:20

本帖最后由 孤独的凯 于 2017-8-29 21:56 编辑

用gcc -E 试了下宏展开是 c=a+b*a+++ ++b;
中间有个空格第二个ADD展开的时候有空格
估计是编译器的原因

avr_sz 发表于 2017-8-29 23:05:16

说明编译器比较智能,不只是简单的展开

wistarky 发表于 2017-8-30 00:22:32

建议用
#define ADD(a,b) (a+b)
或者是
#define ADD(a,b) ((a)+(b))

bhwyg 发表于 2017-8-30 03:05:06

wistarky 发表于 2017-8-30 00:22
建议用
#define ADD(a,b) (a+b)
或者是


这时对的,看过一本c语言书中就提到防止编译器展开出问题,宏定义一定要用括号分清楚

takashiki 发表于 2017-8-30 05:46:43

建议楼主使用#define ADD(a, b) ((a) + (b))而不是别的,另外不要写下面的表达式,何必违反MISRA C给自己找麻烦。程序要求可读性、健壮性,不是用来显摆的。

takashiki 发表于 2017-8-30 05:50:04

bhwyg 发表于 2017-8-30 03:05
这时对的,看过一本c语言书中就提到防止编译器展开出问题,宏定义一定要用括号分清楚 ...

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

wswh2o 发表于 2017-8-30 08:34:51

程序当然不会这么写,只是看到这样一个问题,所以追问一下原因。

bhwyg 发表于 2017-8-30 08:46:32

takashiki 发表于 2017-8-30 05:50
你也知道宏定义要用括号分清楚,那么第一个方案就是错的。无法正确识别ADD(11)的意图 ...

是的,宏定义一律用括号。

xuzhiping9889 发表于 2017-8-30 09:50:07

编译器没那么智能,建议楼主在不清楚运算顺序的情况下多用括号吧

sbusr 发表于 2017-8-30 09:59:27

宏是直接替换,你试试把你用宏的地方直接替换后是啥

wswh2o 发表于 2017-8-30 10:37:52

二楼是真相,{:handshake:}

zhugean 发表于 2017-8-30 11:54:32

#define ADD(a,b)    ((a)+(b))

hnzbding 发表于 2017-8-30 23:10:11

为什么非要这样写代码,不能分成几句写吗
页: [1]
查看完整版本: 请教大家一个c语言的宏定义的问题