2015-01-07 4 views
9
#include <iostream> gfhgfhgf 
using namespace std; 

int main() { 
    return 0; 
} 

Warum kompiliert dieser Codeausschnitt? Nach The gcc reference on Include Syntax:Kein Compilerfehler bei Verwendung von Garbage-Zeichen in #include-Anweisung

Es ist ein Fehler, wenn in der Zeile nach dem Dateinamen (außer Kommentaren) etwas vorhanden ist.

und genau das wird im Code gemacht.

+0

Was ist dein Compiler? Mine ('clang-600.0.51') gibt eine Warnung aus. – NPE

+0

Die Präprozessor Grammatik von MSVC2013 lässt explizit auch nicht zu: http://msdn.microsoft.com/en-us/library/scxys89.aspx – Bathsheba

Antwort

12

Mit den -pedantic-errors Fahnen in gcc und clang schaltet diese in einen Fehler see it live:

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

, die es ist eine Erweiterung angibt.

Wenn wir die Interfacing C and TAL In The Tandem Environment aussehen haben sie einige Code wie folgt aus:

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

So beide gcc und clang Unterstützung zusätzliche Zeichen nach der Richtlinie enthalten eine Erweiterung auf einigen Plattformen erforderlich zu unterstützen. die -pedantic flags Verwenden macht gcc und clang eine Warnung für Erweiterungen erzeugen, die den Standard verletzen und wie oben erwähnt, Sie -pendatic-errors zu drehen diese in einen Fehler (Hervorhebung von mir) verwenden können:

zu erhalten alle erforderlichen Diagnose nach dem Standard sollten Sie auch -pedantic (oder -pedantic-errors angeben, wenn Sie wollen, dass sie Fehler statt Warnungen sind).

Wir können eine Referenz für die nolist Erweiterung im HP'sC/C++ Programmers guide for NonStop Systrms finden, die sagt:

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. 

Hinweis definiert die draft C++ standard die Grammatik für diese Form der include in Abschnitt 16.2[cpp .include] wie folgt:

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