No compiler error on using garbage characters in #

2019-02-16 17:53发布

问题:

#include <iostream> gfhgfhgf
using namespace std;

int main() {
    return 0;
}

Why does this code snippet compile? As per The gcc reference on Include Syntax:

It is an error if there is anything (other than comments) on the line after the file name.

and that's exactly what's being done in the code.

回答1:

Using the -pedantic-errors flags in gcc and clang turns this into an error see it live:

error: extra tokens at end of #include directive
#include <iostream> gfhgfhgf
                    ^

which indicates it is an extension.

If we look at the Interfacing C and TAL In The Tandem Environment they have some code like this:

#include <stdlibh> nolist
                   ^^^^^^

So both gcc and clang support extra characters after the include directive to support an extension needed on some platforms. Using the -pedantic flags makes gcc and clang produce a warning for extensions that violate the standard and as noted above you can use -pendatic-errors to turn this into an error (emphasis mine):

to obtain all the diagnostics required by the standard, you should also specify -pedantic (or -pedantic-errors if you want them to be errors rather than warnings).

We can find a reference for the nolist extension in the HP'sC/C++ Programmers guide for NonStop Systrms which says:

nolist
  directs the compiler not to list the contents of the file or sections
  being included.
This is an HP NonStop  extension to the standard.

Note, the draft C++ standard defines the grammar for this form of include in section 16.2 [cpp.include] as follows:

# include < h-char-sequence> new-line