今天讀代碼時候,看到這樣的代碼。。
#define MG_SET_PTRPTR(_ptr, _v) \ do { \ if (_ptr) *(_ptr) = _v; \ } while (0)
1、對於帶有if 語句的宏,無論是內核還是開源代碼,都是用到了do while(0)技巧。問題來了,為什么要這樣搞呢?
很簡單,假設存在
if XXX { if (_ptr) *(_ptr) = _v; } else { .... }
如果這里沒有do while,那么是不是后面的else語句匹配出錯了呢????
導致的效果是:編譯能通過,但是執行出錯。
2、還會存在一種極度惡心的情況。
假設存在宏展開后為:
a = a + 1; b = a;
那么,有:
if xxxx a = a + 1; b = a; else XXXX
那么會導致編譯通不過。
所以內核也好,開源軟件也好,為了解決宏帶來的問題,不得不引入這種do while(0) 這樣的代碼。。。