
-----Original Message----- From: boost-bounces@lists.boost.org [mailto:boost-bounces@lists.boost.org] On Behalf Of Paul Mensonides
So if I understand you correctly, it should just skip over any gibberish it might encounter until the matching #endif is found?
Yes, except that it still must tokenize the block. You can still get errors in tokenization, such as:
#if 0 "half-open // error #endif
Is the preprocessor allowed to issue warnings about the gibberish?
The main point about the above is that the block must be tokenized, but it should not be parsed to produce directives or scanned for macro replacement.
What I said here isn't quite correct, so I'll elaborate. The block has to be parsed just enough to determine nested conditional compilation blocks. E.g. #if 0 #if 0 #endif #endif ...but it isn't supposed to parse anything else--including an operands to directives. So, the following should still work: #if 0 #if // no expression! #endif #endif So, basically, the only parse is to tell if a name following '#' on a new line is one of the conditional compilation directives or not. Specifically, from 16.1/6, "...the group that it controls is skipped: directives are processed only through the name that determines the directive in order to keep track of the level of nested conditionals; the rest of the directives' preprocessing tokens are ignored, as are the other preprocessing tokens in the group." Regards, Paul Mensonides