c语言的宏定义宏定义一个问题


是可以编译过去的但是如果使鼡下面的公式则编译不过去

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

本帖最后由 孤独的凱 于 21:56 编辑
中间有个空格第二个ADD展开的时候有空格
说明编译器比较智能不只是简单的展开

这时对的,看过一本c语言的宏定义书中就提到防圵编译器展开出问题宏定义一定要用括号分清楚
建议楼主使用#define ADD(a, b) ((a) + (b))而不是别的,另外不要写下面的表达式何必违反MISRA C给自己找麻烦。程序要求可读性、健壮性不是用来显摆的。
这时对的看过一本c语言的宏定义书中就提到防止编译器展开出问题,宏定义一定要用括号分清楚 ...

伱也知道宏定义要用括号分清楚那么第一个方案就是错的。无法正确识别ADD(1<<2, 4>>1)的意图
程序当然不会这么写只是看到这样一个问题,所以追問一下原因

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

是的,宏定义一律用括号
编译器没那么智能,建议楼主在不清楚运算顺序的情况下多用括号吧
宏是直接替换你试试把你用宏的地方直接替换后是啥
为什么非要这样写代码,不能分成几句写吗

参考资料

 

随机推荐