RE: Linux-wireless: why use macro to call functions
Hi, Why here is used a macro instead of an inline func. Thanks, Martin -----Original Message----- From: "Daniel Baluta" <daniel.baluta@gmail.com> Sent: 23/12/2013 08.27 To: "Fred Chou" <fred.chou.nd@gmail.com> Cc: "kernelnewbies" <kernelnewbies@kernelnewbies.org> Subject: Re: Linux-wireless: why use macro to call functions On Mon, Dec 23, 2013 at 8:05 AM, Fred Chou <fred.chou.nd@gmail.com> wrote:
Hi,
I was studying the Linux wireless subsystem code and noticed this code (in ieee80211_rx_handlers):
It first defines the macro:
#define CALL_RXH(rxh) \ do { \ res = rxh(rx); \ if (res != RX_CONTINUE) \ goto rxh_next; \ } while (0);
Then the macro is used to call a series of functions:
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)
My question is, why not just call the functions directly like:
ieee80211_rx_h_check_more_data(rx); ieee80211_rx_h_uapsd_and_pspoll(rx);
...
Is it just for the sake of outlining the code for easy reading? Appreciate if anyone can explain. Thanks!
Hi, As you can see above the macro does also error checking.I don't necessarily think that the code is easier to read, but it can save you some typing. thanks, Daniel. _______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Hi! On Mon, 2013-12-23 at 11:23 +0100, Martin Brugnara wrote: [...]
Why here is used a macro instead of an inline func.
Maybe you should get a book to learn "C"? The macro uses "goto" which won't work with inline functions in that situation. Since the macro uses the only argument exactly once, it actually makes no functional/semantic difference if it is a macro or would be an inline function (and performance-wise very probably too with any somewhat recent compiler). And the macro just avoids to copy-paste identical lines/logic. And you surely should learn to quote correctly and thus avoid top posting completely. [... fullquote deleted ...] Bernd -- Bernd Petrovitsch Email : bernd@petrovitsch.priv.at LUGA : http://www.luga.at
Hi, On Mon, Dec 23, 2013 at 8:03 PM, Bernd Petrovitsch < bernd@petrovitsch.priv.at> wrote: [...]
And the macro just avoids to copy-paste identical lines/logic.
Thank you all for the explanation. Originally I was wondering if there could be some other reasons. So the main (or only?) purpose of the macro is to save some typing, and in terms of functionality I could equivalently call each handlers. Fred
Fred Chou <fred.chou.nd@gmail.com> wrote:
Hi,
On Mon, Dec 23, 2013 at 8:03 PM, Bernd Petrovitsch < bernd@petrovitsch.priv.at> wrote: [...]
And the macro just avoids to copy-paste identical lines/logic.
Thank you all for the explanation. Originally I was wondering if there could be some other reasons. So the main (or only?) purpose of the macro is to save some typing, and in terms of functionality I could equivalently call each handlers.
Fred
If you do decide to inline the code, you should probably get rid of the do while(0) part. That exists just to get rid of side effects of using macros in various syntax situations. http://c-faq.com/cpp/multistmt.html Greg -- Sent from my Android phone with K-9 Mail. Please excuse my brevity.
So the main (or only?) purpose of the macro is to save
Better to say it saves cutting and pasting, which is a damn good thing -- even if macros are an old fashioned way of doing it.
in terms of functionality I could equivalently call each handlers.
But then you would have to call them repeatedly inside a loop and check for errors in the same way as is done in the macro. Not just call the function. On 24 December 2013 13:19, Fred Chou <fred.chou.nd@gmail.com> wrote:
Hi,
On Mon, Dec 23, 2013 at 8:03 PM, Bernd Petrovitsch <bernd@petrovitsch.priv.at> wrote: [...]
And the macro just avoids to copy-paste identical lines/logic.
Thank you all for the explanation. Originally I was wondering if there could be some other reasons. So the main (or only?) purpose of the macro is to save some typing, and in terms of functionality I could equivalently call each handlers.
Fred
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- Adrian Ratnapala mobile: +49 1515 277 0000 NGBitS GmbH Rainer Strasse 7 83104 Ostermünchen Web: www.ngbits.com
On Tue, 24 Dec 2013 14:48:33 +0100, Adrian Ratnapala said:
So the main (or only?) purpose of the macro is to save
Better to say it saves cutting and pasting, which is a damn good thing -- even if macros are an old fashioned way of doing it.
The biggest benefit of macros isn't saving the typing. It's so that if a change is required, you just have to make it once, not 35 times for the 37 times you cut-n-pasted it.
participants (6)
-
Adrian Ratnapala -
Bernd Petrovitsch -
Fred Chou -
Greg Freemyer -
Martin Brugnara -
Valdis.Kletnieks@vt.edu