2013-12-23 42 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() 
} 
相关问题