為什么要用do-while(0)?


今天讀代碼時候,看到這樣的代碼。。

#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) 這樣的代碼。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM