[問題] Linux WARN_ON 中的 !!condition

看板C_and_CPP作者 (艾琳娜)時間9年前 (2016/08/22 20:25), 9年前編輯推噓3(307)
留言10則, 5人參與, 最新討論串1/1
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://www.ptt.cc/bbs/C_and_CPP/M.1471868723.A.911.html

08/22 20:29, , 1F
上網查論壇也是看到只會等於0和1 學到一招
08/22 20:29, 1F

08/22 20:29, , 2F
likely / unlikely 的 macro 中會再做一次, 這裡有點多餘?
08/22 20:29, 2F

08/22 20:49, , 3F
就是你說的那樣 不用管condition型態 永遠會得到true/fa
08/22 20:49, 3F

08/22 20:50, , 4F
lse 用 int 去接 bool 應該也是老 code 了
08/22 20:50, 4F
意思是如果不這樣做可能要先轉型囉? 例如檢查傳入的 (int *) 是否為 null ※ 編輯: Eleina (27.122.242.72), 08/22/2016 20:55:01

08/22 23:39, , 5F
僅僅是想利用C any to bool implicit cast特性而已
08/22 23:39, 5F

08/23 02:18, , 6F
關於再做一次的問題, 現在的編譯器能把這樣的兩個判斷化簡
08/23 02:18, 6F

08/23 02:19, , 7F
不過這裡變成 0 或 1 其實我猜跟 likely / unlikely 有關
08/23 02:19, 7F

08/23 02:20, , 8F
因為 likely / unlikely 實際上是 expect 1/0
08/23 02:20, 8F

08/23 02:20, , 9F
但是傳進來的 condition 可以是任意整數
08/23 02:20, 9F

08/23 13:49, , 10F
應該也是用bool就好
08/23 13:49, 10F
文章代碼(AID): #1NkkypaH (C_and_CPP)