作者Eleina (艾琳娜)
看板C_and_CPP
标题[问题] Linux WARN_ON 中的 !!condition
时间Mon Aug 22 20:25:21 2016
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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 27.122.242.72
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1471868723.A.911.html
1F:→ ilikekotomi: 上网查论坛也是看到只会等於0和1 学到一招 08/22 20:29
2F:→ Eleina: likely / unlikely 的 macro 中会再做一次, 这里有点多余? 08/22 20:29
3F:推 nowar100: 就是你说的那样 不用管condition型态 永远会得到true/fa 08/22 20:49
4F:→ nowar100: lse 用 int 去接 bool 应该也是老 code 了 08/22 20:50
意思是如果不这样做可能要先转型罗? 例如检查传入的 (int *) 是否为 null
※ 编辑: Eleina (27.122.242.72), 08/22/2016 20:55:01
5F:→ nowar100: 仅仅是想利用C any to bool implicit cast特性而已 08/22 23:39
6F:推 LPH66: 关於再做一次的问题, 现在的编译器能把这样的两个判断化简 08/23 02:18
7F:→ LPH66: 不过这里变成 0 或 1 其实我猜跟 likely / unlikely 有关 08/23 02:19
8F:→ LPH66: 因为 likely / unlikely 实际上是 expect 1/0 08/23 02:20
9F:→ LPH66: 但是传进来的 condition 可以是任意整数 08/23 02:20
10F:推 bluesoul: 应该也是用bool就好 08/23 13:49