Re: [PATCH] Documentation: Explain a second alternative for multi-line macros.
- From: "Robert P. J. Day" <rpjday@xxxxxxxxxxxxxx>
- Date: Sun, 31 Dec 2006 15:13:59 -0500 (EST)
On Sun, 31 Dec 2006, Muli Ben-Yehuda wrote:
On Sun, Dec 31, 2006 at 02:49:48PM -0500, Robert P. J. Day wrote:
there would appear to be *lots* of cases where the ({ }) notation
is used when nothing is being returned. i'm not sure you can be
that adamant about that distinction at this point.
IMHO, the main point of CodingStyle is to clarify how new code
should be written and old code should've been written.
ok, how about this as a patch:
diff --git a/Documentation/CodingStyle b/Documentation/CodingStyle
index 9069189..064a13e 100644
--- a/Documentation/CodingStyle
+++ b/Documentation/CodingStyle
@@ -549,13 +549,26 @@ may be named in lower case.
Generally, inline functions are preferable to macros resembling functions.
-Macros with multiple statements should be enclosed in a do - while block:
-
-#define macrofun(a, b, c) \
- do { \
- if (a == 5) \
- do_this(b, c); \
- } while (0)
+There are two techniques for defining macros that contain multiple
+statements, depending on whether you're returning a value or not:
+
+ (a) If there is no return value from the macro, you should enclose
+ the statements in a do - while block, as in:
+
+ #define macrofun(a, b, c) \
+ do { \
+ if (a == 5) \
+ do_this(b, c); \
+ } while (0)
+
+ (b) If the macro is designed to return a value, you should use the
+ gcc extension that a compound statement enclosed in parentheses
+ represents an expression, as in:
+
+ #define maxint(a, b) ({ \
+ int _a = (a), _b = (b); \
+ _a > _b ? _a : _b; \
+ })
Things to avoid when using macros:
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
- References:
- [PATCH] Documentation: Explain a second alternative for multi-line macros.
- From: Robert P. J. Day
- Re: [PATCH] Documentation: Explain a second alternative for multi-line macros.
- From: Muli Ben-Yehuda
- Re: [PATCH] Documentation: Explain a second alternative for multi-line macros.
- From: Robert P. J. Day
- Re: [PATCH] Documentation: Explain a second alternative for multi-line macros.
- From: Muli Ben-Yehuda
- [PATCH] Documentation: Explain a second alternative for multi-line macros.
- Prev by Date: Re: compile failure on 2.6.19
- Next by Date: Re: [PATCH] net/core/flow.c: compare data with memcmp
- Previous by thread: Re: [PATCH] Documentation: Explain a second alternative for multi-line macros.
- Index(es):
Relevant Pages
- Re: Macros: returning multiple lists
... The standard mechanism to have multiple forms returned from macros is to ...
enclose them in a PROGN. ... (comp.lang.lisp) - [PATCH] Documentation: Explain a second alternative for multi-line macros.
... Add an explanation for defining multi-line macros using the ... inline functions
are preferable to macros resembling functions. ... Enclose those statements in a
do - while block: ... (Linux-Kernel) - Re: rvalue
... > I'm working on a very buggy piece of code that uses a lot of macros. ...
> can only be used as rvalues and not as lvalues. ... I usually prefer to enclose
all reference to macro arguments in ... (comp.lang.c) - Re: conditional operator again
... With macros, you should _always_ enclose the parameters in parenthesis:
... ptr = func. ... (comp.lang.c) - Coding style: do_this(a,b) vs. do_this(a, b)
... This makes it standartize on ", ... Macros with multiple statements
should be enclosed in a do - while block: ... send the line "unsubscribe linux-kernel"
in ... (Linux-Kernel)