首先看一下下面的代码
#define MAX(a, b) \ ({ \ typeof(a) _a = a; \ typeof(b) _b = b; \ (void)(&_a == &_b); \ ((_a)>(_b) ? (_a) : (_b)); \ })
({......})是语句表达式
问题1:
里面的(void)(&_a==&_b)书上说是比较地址类型,但这不是比较地址吗?为什么会是比较地址类型?
问题2:
还是有关(void)(&_a==&_b),书上说它的作用是“前面的强类型转换(void)目的是要让编译器认为后面的比较语句是有作用的,从而不会因为误以为没有实际作用而报出其他我们不需要的警告。”
1.“前面的强类型转换(void)目的是要让编译器认为后面的比较语句是有作用的”这句话,编译器从上往下编译,应该是不会忽略掉后面的语句的,那“让编译器认为后面的比较语句是有作用的”这句话是不是有点多余??
2.我去掉那条语句的时候编译的时候没有警告,加上反倒有警告,无法理解“编译器从而不会因为误以为没有实际作用而报出其他我们不需要的警告”