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

int main() { 
    return 0; 
} 

Perché questo snippet di codice viene compilato? Come da The gcc reference on Include Syntax:Nessun errore del compilatore sull'uso di caratteri illeggibili in #include statement

Si tratta di un errore se c'è qualcosa (altro che commenti) sulla linea dopo il nome del file.

e questo è esattamente ciò che viene fatto nel codice.

+0

Qual è il tuo compilatore? Il mio ('clang-600.0.51') emette un avviso. – NPE

+0

Anche la grammatica del preprocessore MSVC2013 non consente esplicitamente: http://msdn.microsoft.com/en-us/library/2scxys89.aspx – Bathsheba

risposta

12

Usando i -pedantic-errors bandiere gcc e clang trasforma questa in un errore see it live:

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

che indica che è un'estensione.

Se guardiamo al Interfacing C and TAL In The Tandem Environment hanno qualche codice come questo:

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

in modo che entrambi gcc e clang supporto caratteri supplementari dopo la direttiva include per sostenere un'estensione necessaria su alcune piattaforme. Utilizzando il -pedantic flags rende gcc e clang produrre un avvertimento per le estensioni che violano gli standard e come osservato in precedenza che è possibile utilizzare -pendatic-errors di trasformare questo in un errore (sottolineatura mia):

a ottenere tutte le diagnostiche necessarie in base allo standard, è necessario specificare anche -pedantic (o -pedantic-errors se si desidera che siano gli errori anziché gli avvertimenti) .

Siamo in grado di trovare un riferimento per la nolist estensione nella HP'sC/C++ Programmers guide for NonStop Systrms che dice:

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. 

nota, il draft C++ standard definisce la grammatica per questa forma di include nella sezione 16.2[cpp .include] come segue:

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