今天看原始碼的時候,發現某個框架的原始碼裡面經常出現如下片段:
do
}while
(false
)
我對於do{} while(false)
結構的使用,在此之前無非兩種,第一種是基本用法,也就是把它當成迴圈結構使用,和for(;;)
,while(){}
沒太大區別;還有一種用法是用在巨集定義中,如下所示:
#define larger(x,y) do
while
(false
)
這種方法在巨集定義中很討巧,因為巨集定義在c/c++中是簡單的字元替代,經常會出現字元替代過程**現的語義問題,如:
#define larger(x,y) x > y? x:y
int a =2*
larger(10
,30);
此時我們本來期望a = 60
,其實因為字元替代的原因,實際上是int a = 2 * x > y?x:y =30
。這就是bug的源頭之一。通過do while(false)
結構,能對macro_code
進行很好的分割。
然而,這個結構還有乙個好處,其本質是乙個迴圈結構,意味著它可以提前break,在多條件判斷的環境下是乙個作為對goto
的很好的取代。如:
doif(
is_exist
(path)
)// the residual code you need , the main stream
}while
(false
)
通過這種手段,基於作為入口條件判斷,如果一旦不符合條件,可以直接break,跳到迴圈之外,這相當於很好地應用了goto
的功能,而沒有引入goto
的負作用(全域性跳轉,難以維護)。
[1].
do while false 技巧揭密
do dwsize msg hdr len dwstatus gu recvall sessionsocket szprotobuffer,dwsize if 0 dwstatus if pmsghdr dwacknumber dwacknumber if pmsghdr dwretstatus 0...
do while false 實用技巧
今天看專案原始碼的時候發現有些地方用了do while false 的用法,查了下發現這樣確實有些優點,mark下。1.最重要的優點,用在略微複雜的巨集定義中。define ab1 a b x,下面語句b不能被執行 if cond ab1 define ab2 x,下面語句編譯出錯 if cond ...
邏輯結構,儲存結構,物理結構的區分
邏輯結構 是指資料元素之間的邏輯關係,從邏輯關係上描述資訊。儲存結構 又稱物理結構 資料結構在計算機中的表示 又稱映像 很好理解,但是光靠這些官話,做題保準做乙個錯乙個 不信?下面放一道題 線索二叉樹是一種 結構?a.邏輯 b.邏輯和儲存 c.物理 d.線性 是不是一般人都會想選a,猶豫一點的會想選...