Re: [PATCH] Documentation: Explain a second alternative for multi-line macros.



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/



Relevant Pages