【发布时间】:2016-05-18 10:24:06
【问题描述】:
Linux 内核定义了许多用于类型中性数值运算的辅助宏。即宏min和max定义为(在include/linux/kernel.h中)
#ifndef max
#define max(x, y) ({ \
typeof(x) _max1 = (x); \
typeof(y) _max2 = (y); \
(void) (&_max1 == &_max2); \
_max1 > _max2 ? _max1 : _max2; })
#endif
#ifndef min
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
#endif
扩展时,它们会生成匿名函数,这些函数执行操作类型中性和表达式分配安全的方式(使用 GCC 匿名函数)。到目前为止,一切都很好。令我惊讶的是这些宏产生的倒数第二个表达式:
(void) (&_min1 == &_min2);
比较匿名函数范围内定义的临时变量的地址,然后丢弃结果; (void) 演员表防止出现任何警告。
我想知道这是什么期望的副作用?天真地我希望这会得到优化,因为它没有副作用(至少我不知道)。
【问题讨论】:
-
获取地址通常会强制将值转储到内存中。您不能获取寄存器变量的地址
标签: c