[问题] Linux WARN_ON 中的 !!condition

楼主: Eleina (艾琳娜)   2016-08-22 20:25:21
Linux
#ifndef WARN_ON
#define WARN_ON(condition) ({ \
int __ret_warn_on = !!(condition); \
if (unlikely(__ret_warn_on)) \
__WARN(); \
unlikely(__ret_warn_on); \
})
#endif
请问这里使用双重否定有什么好处?
似乎是迫使 __ret_warn_on 只会等于 0 或 1
作者: ilikekotomi (Young)   2016-08-22 20:29:00
上网查论坛也是看到只会等于0和1 学到一招
楼主: Eleina (艾琳娜)   2016-08-22 20:29:00
likely / unlikely 的 macro 中会再做一次, 这里有点多余?
作者: nowar100 (抛砖引玉)   2016-08-22 20:49:00
就是你说的那样 不用管condition型态 永远会得到true/false 用 int 去接 bool 应该也是老 code 了仅仅是想利用C any to bool implicit cast特性而已
作者: LPH66 (-6.2598534e+18f)   2016-08-23 02:18:00
关于再做一次的问题, 现在的编译器能把这样的两个判断化简不过这里变成 0 或 1 其实我猜跟 likely / unlikely 有关因为 likely / unlikely 实际上是 expect 1/0但是传进来的 condition 可以是任意整数
作者: bluesoul (忙死你老爸)   2016-08-23 13:49:00
应该也是用bool就好

Links booklink

Contact Us: admin [ a t ] ucptt.com