about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCorey Farwell <coreyf@rwell.org>2017-02-15 23:48:12 -0500
committerGitHub <noreply@github.com>2017-02-15 23:48:12 -0500
commitef45eca8a5208d99560f56159adbe349246d7a3c (patch)
tree58dc9a8487793dc48f708910c5aa7b59f5368653
parent4d6019d07a942f5041e3d81f974f34515b024d0a (diff)
parentb6a161833289d402986164912aeb9d005857675d (diff)
downloadrust-ef45eca8a5208d99560f56159adbe349246d7a3c.tar.gz
rust-ef45eca8a5208d99560f56159adbe349246d7a3c.zip
Rollup merge of #39775 - mina86:master, r=steveklabnik
book: don’t use GNU extensions in the example unnecessarily

The use of a GNU C extension for bloc expressions is immaterial to the
actual problem with C macros that the section tries to show so don’t
use it and instead use a plain C way of writing the macro which has
added benefit of being better C code (since the macro now behaves like
a function, syntax-wise).
-rw-r--r--src/doc/book/src/macros.md14
1 files changed, 6 insertions, 8 deletions
diff --git a/src/doc/book/src/macros.md b/src/doc/book/src/macros.md
index 3ccbeb05f01..ae1e1c65dd2 100644
--- a/src/doc/book/src/macros.md
+++ b/src/doc/book/src/macros.md
@@ -261,36 +261,34 @@ The metavariable `$x` is parsed as a single expression node, and keeps its
 place in the syntax tree even after substitution.
 
 Another common problem in macro systems is ‘variable capture’. Here’s a C
-macro, using [a GNU C extension] to emulate Rust’s expression blocks.
-
-[a GNU C extension]: https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
+macro using a block with multiple statements.
 
 ```text
-#define LOG(msg) ({ \
+#define LOG(msg) do { \
     int state = get_log_state(); \
     if (state > 0) { \
         printf("log(%d): %s\n", state, msg); \
     } \
-})
+} while (0)
 ```
 
 Here’s a simple use case that goes terribly wrong:
 
 ```text
 const char *state = "reticulating splines";
-LOG(state)
+LOG(state);
 ```
 
 This expands to
 
 ```text
 const char *state = "reticulating splines";
-{
+do {
     int state = get_log_state();
     if (state > 0) {
         printf("log(%d): %s\n", state, state);
     }
-}
+} while (0);
 ```
 
 The second variable named `state` shadows the first one.  This is a problem