请教大家一个c语言的宏定义的问题
如下的宏定义:#define ADD(a,b) a+b
c=ADD(a,b)*ADD(a++,++b);
是可以编译过去的,但是如果使用下面的公式则编译不过去
c=a+b*a+++++b;
个人理解使用宏展开后和上述公式应该是一致的啊,为啥一个可以编译过去,一个不可以? 本帖最后由 孤独的凯 于 2017-8-29 21:56 编辑
用gcc -E 试了下宏展开是 c=a+b*a+++ ++b;
中间有个空格第二个ADD展开的时候有空格
估计是编译器的原因
说明编译器比较智能,不只是简单的展开 建议用
#define ADD(a,b) (a+b)
或者是
#define ADD(a,b) ((a)+(b)) wistarky 发表于 2017-8-30 00:22
建议用
#define ADD(a,b) (a+b)
或者是
这时对的,看过一本c语言书中就提到防止编译器展开出问题,宏定义一定要用括号分清楚 建议楼主使用#define ADD(a, b) ((a) + (b))而不是别的,另外不要写下面的表达式,何必违反MISRA C给自己找麻烦。程序要求可读性、健壮性,不是用来显摆的。 bhwyg 发表于 2017-8-30 03:05
这时对的,看过一本c语言书中就提到防止编译器展开出问题,宏定义一定要用括号分清楚 ...
你也知道宏定义要用括号分清楚,那么第一个方案就是错的。无法正确识别ADD(1<<2, 4>>1)的意图 程序当然不会这么写,只是看到这样一个问题,所以追问一下原因。 takashiki 发表于 2017-8-30 05:50
你也知道宏定义要用括号分清楚,那么第一个方案就是错的。无法正确识别ADD(11)的意图 ...
是的,宏定义一律用括号。 编译器没那么智能,建议楼主在不清楚运算顺序的情况下多用括号吧 宏是直接替换,你试试把你用宏的地方直接替换后是啥 二楼是真相,{:handshake:} #define ADD(a,b) ((a)+(b)) 为什么非要这样写代码,不能分成几句写吗
页:
[1]