home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / lang / c / 12459 < prev    next >
Encoding:
Internet Message Format  |  1992-08-17  |  2.1 KB

  1. Xref: sparky comp.lang.c:12459 gnu.gcc.help:1923
  2. Newsgroups: comp.lang.c,gnu.gcc,gnu.gcc.help
  3. Path: sparky!uunet!think.com!spdcc!dirtydog.ima.isc.com!karl
  4. From: karl@ima.isc.com (Karl Heuer)
  5. Subject: Re: gcc-cpp chokes: bug or feature?
  6. Message-ID: <1992Aug18.032513.28768@ima.isc.com>
  7. Sender: usenet@ima.isc.com (news)
  8. Organization: Interactive Systems, Cambridge, MA 02138-5302
  9. References: <BszKpr.GBu@cs.columbia.edu>
  10. Date: Tue, 18 Aug 1992 03:25:13 GMT
  11. Lines: 42
  12.  
  13. In article <BszKpr.GBu@cs.columbia.edu> leland@cs.columbia.edu (Leland Woodbury) writes:
  14. >Why is it parsing what should be getting ifdef'd out?
  15.  
  16.     /* example #1 */
  17.     #if 0
  18.     /*
  19.     #else
  20.     /* */
  21.     printf("hello\n");
  22.     #endif
  23. Does the preprocessor ignore everything between #if 0 and #else, in which
  24. case the printf() is active (since it's between the #else and #endif)?  Or is
  25. `/* #else /* */' merely a comment, in which case the printf() is inactive?
  26.  
  27. Answer: Both Classic C and ANSI C use the latter interpretation.  Hence the
  28. preprocessor must do lexing of comments, even inside if'd out sections.
  29.  
  30.     /* example #2 */
  31.     #if 0
  32.     "\
  33.     #else /*"/**/
  34.     printf("hello\n");
  35.     #endif
  36.  
  37. This case is similar: the #if'd block contains a string literal (which happens
  38. to include a continuation line), a comment (which happens to include an
  39. embedded `/*'), and a printf().  It does not include an #else.  Again, Classic
  40. C and ANSI C agree on this.
  41.  
  42. So you see, the preprocessor has always done lexical analysis within #if'd
  43. blocks, even in Classic C.  It happens that the Reiser preprocessor, when
  44. it encountered an unescaped newline inside a string literal or character
  45. constant, would silently close the quotes.  This was one of several
  46. arbitrary decisions that were documented in the preamble to the cpp source.
  47. (Fascinating reading; I didn't realize how many loopholes there were in the
  48. informal K&R specification.)  ANSI C did not require this particular quirk,
  49. and the GNU people chose to produce a diagnostic for it instead.
  50.  
  51. I personally prefer the diagnostic.  I don't like having compilers play "guess
  52. what I'm thinking, and compile it".
  53.  
  54. Karl W. Z. Heuer (karl@ima.isc.com or uunet!ima!karl), The Walking Lint
  55.