[問題] 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