2013-12-23 44 views
0

我正在學習Linux的無線子系統的代碼,發現這個代碼(在ieee80211_rx_handlers):爲什麼要使用宏來調用函數

它首先定義了宏:

#define CALL_RXH(rxh)     \ 
     do {       \ 
       res = rxh(rx);   \ 
        if (res != RX_CONTINUE) \ 
         goto rxh_next; \ 
     } while (0); 

然後宏用來調用一系列功能:

CALL_RXH(ieee80211_rx_h_check_more_data) 

CALL_RXH(ieee80211_rx_h_uapsd_and_pspoll) 

CALL_RXH(ieee80211_rx_h_sta_process) 

CALL_RXH(ieee80211_rx_h_decrypt) 

CALL_RXH(ieee80211_rx_h_defragment) 

CALL_RXH(ieee80211_rx_h_michael_mic_verify) 

我的問題是,爲什麼不直接調用函數直接,如:

ieee80211_rx_h_check_more_data(rx); 

ieee80211_rx_h_uapsd_and_pspoll(rx); 

... 

僅僅是爲了簡單易讀的代碼概述?

+2

你認識到你建議與實際發生的不同,對吧? –

+0

我想這是因爲goto。 –

+0

MACRO中有一個小邏輯,如果你只是擴展它,它會擴大源文件的大小,而且MACRO可以避免在重複這個邏輯時出現錯誤,我想 –

回答

1

宏的每種用法都擴展爲if檢查和goto,而不僅僅是一個函數調用。

if測試只有通過調用哪個函數來產生條件纔會有所不同。因爲代碼會是重複的,所以他們使用宏來生成樣板。

他們也許可能穿插呼叫res = xyz(rx);與一個宏擴展到if … goto部分,然後宏不會採取任何參數。封裝到宏中的多少是代碼因式風格。

0

do {} while(0)宏可以很容易地在條件塊中使用。

#define FUNC1() doing A; dong B; 
#define FUNC2() do { doing A; doing B; } while(0) 

我們可以使用FUNC2()的,如果這樣的條件代碼塊:

if (true) 
    FUNC2(); 

但FUNC1()只能像這樣使用:

if (true) { 
    FUNC1() 
} 
相關問題