title: Macros like "case_GETOPT_HELP_CHAR" risky?
body: <p>I'm studying the coreutils source codes to get better in programming and I found these lines in base64.c and in others:</p>
  
  <pre><code>while ((opt = getopt_long (argc, argv, "diw:", long_options, NULL)) != -1)
  switch (opt)
  {
  // ... other stuff
    case_GETOPT_HELP_CHAR; // &lt;- this especially
  
    case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
  // .. other stuff again
  </code></pre>
  
  <p>I didn't know what the heck this means, until I found this one in system.h :</p>
  
  <pre><code>#define case_GETOPT_HELP_CHAR           \
   case GETOPT_HELP_CHAR:         \
   usage (EXIT_SUCCESS);          \
   break;
  </code></pre>
  
  <p>I didn't know that you can actually make Macros that consists of so many statements!
  Isn't it risky to use so many statements in Macros or is this a good coding-style I should learn?</p>
  
  <p>EDIT: Also I noticed there are actually alot of MACROS used in coreutils.
  It confuses me a little bit, because I come from a C++ background.</p>
  
  <pre><code>#define STREQ(a, b) (strcmp (a, b) == 0)
  </code></pre>
  
  <p>For example this one above, is it really necessary? It makes reading the code harder and there is not much saved by just doing STREQ in an inf statement</p>
  
  <p>EDIT2: On the other hand, I like this one very much, thanks to Jay:</p>
  
  <pre><code> #define COMMAND(NAME)  { #NAME, NAME ## _command }
  
   struct command commands[] =
   {
     COMMAND (quit),
     COMMAND (help),
     ...
   };
  </code></pre>