[c++] Qual è la differenza tra #include <filename> e #include "nomefile"?


Answers

L'unico modo per sapere è leggere la documentazione della tua implementazione.

Nello standard C , sezione 6.10.2, i paragrafi da 2 a 4 indicano:

  • Una direttiva di pre-elaborazione del modulo

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

    ricerca una sequenza di luoghi definiti dall'implementazione per un'intestazione identificata univocamente dalla sequenza specificata tra i delimitatori < e > e causa la sostituzione di tale direttiva con l'intero contenuto dell'intestazione. Come vengono specificati i posti o l'intestazione identificata è definita dall'implementazione.

  • Una direttiva di pre-elaborazione del modulo

    #include "q-char-sequence" new-line
    

    causa la sostituzione di tale direttiva con l'intero contenuto del file di origine identificato dalla sequenza specificata tra i " delimitatori " .Il file di origine denominato viene cercato in un modo definito dall'implementazione.Se questa ricerca non è supportata o se la ricerca non riesce , la direttiva viene rielaborata come se leggesse

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

    con la sequenza identica contenuta (compresi i caratteri, se ce ne sono) dalla direttiva originale.

  • Una direttiva di pre-elaborazione del modulo

    #include pp-tokens new-line
    

    (che non corrisponde a una delle due forme precedenti) è permesso. I token di preelaborazione dopo l' include nella direttiva vengono elaborati esattamente come nel testo normale. (Ogni identificatore attualmente definito come nome macro viene sostituito dall'elenco sostitutivo dei token di preelaborazione). La direttiva risultante dopo tutte le sostituzioni deve corrispondere a uno dei due moduli precedenti. Il metodo con cui una sequenza di token di preelaborazione tra una coppia di token di preelaborazione < e una > o una coppia di " caratteri è combinata in un token di pre-elaborazione del nome di singola intestazione è definita dall'implementazione.

definizioni:

  • h-char: qualsiasi membro del set di caratteri di origine ad eccezione del carattere di nuova riga e >

  • q-char: qualsiasi membro del set di caratteri sorgente ad eccezione del carattere di nuova riga e "

Question

Nei linguaggi di programmazione C e C ++, qual è la differenza tra l'uso di parentesi angolari e l'uso di virgolette in un'istruzione di include , come segue?

  1. #include <filename>
  2. #include "filename"



In C ++, includi un file in due modi:

Il primo è #include che dice al preprocessore di cercare il file nella posizione predefinita predefinita. Questa posizione è spesso una variabile di ambiente INCLUDE che indica il percorso per includere i file.

E il secondo tipo è #include "nomefile" che dice al preprocessore di cercare prima il file nella directory corrente, quindi cercarlo nelle posizioni predefinite che l'utente ha impostato.




La documentazione GCC dice quanto segue sulla differenza tra i due:

Sia i file di intestazione utente che di sistema sono inclusi utilizzando la direttiva di pre-elaborazione '#include' . Ha due varianti:

#include <file>

Questa variante viene utilizzata per i file di intestazione di sistema. Cerca un file denominato file in un elenco standard di directory di sistema. Puoi anteporre le directory a questo elenco con l'opzione -I (vedi Invocation ).

#include "file"

Questa variante viene utilizzata per i file di intestazione del proprio programma. Cerca un file denominato file prima nella directory contenente il file corrente, quindi nelle directory di preventivo e quindi nelle stesse directory utilizzate per <file> . È possibile anteporre le directory all'elenco delle directory di preventivo con l'opzione -iquote . L'argomento di '#include' , sia delimitato da virgolette o parentesi angolari, si comporta come una costante di stringa in quanto i commenti non vengono riconosciuti ei nomi di macro non vengono espansi. Pertanto, #include <x/*y> specifica l'inclusione di un file di intestazione di sistema chiamato x/*y .

Tuttavia, se i backslash si verificano all'interno del file, sono considerati normali caratteri di testo, non caratteri di escape. Nessuna delle sequenze di escape dei caratteri appropriate alle costanti stringa in C vengono elaborate. Pertanto, #include "x\n\\y" specifica un nome file contenente tre barre rovesciate. (Alcuni sistemi interpretano '\' come un separatore di pathname, tutti interpretano anche '/' allo stesso modo. È molto più semplice usare solo '/' .)

È un errore se c'è qualcosa (diverso dai commenti) sulla linea dopo il nome del file.




Un #include con parentesi angolari cercherà un "elenco di luoghi dipendente dall'implementazione" (che è un modo molto complicato di dire "intestazioni di sistema") per il file da includere.

Un #include con virgolette cercherà solo un file (e, "in un modo dipendente dall'implementazione", bleh). Il che significa che, in inglese normale, proverà ad applicare il percorso / nome del file che gli viene lanciato e non affiderà un percorso di sistema o manometterà altrimenti.

Inoltre, se #include "" fallisce, viene riletto come #include <> dallo standard.

La g++ ha una descrizione (specifica del compilatore) che, sebbene sia specifica per gcc e non per lo standard, è molto più facile da capire rispetto al discorso in stile avvocato degli standard ISO.




  • #include <> è per i file di intestazione predefiniti

Se il file di intestazione è predefinito, dovrai semplicemente scrivere il nome del file di intestazione in parentesi angolari e apparirebbe come questo (supponendo che abbiamo un nome di file di intestazione predefinito iostream):

#include <iostream>
  • #include " " è per i file di intestazione definiti dal programmatore

Se tu (il programmatore) hai scritto il tuo file di intestazione, dovresti scrivere il nome del file di intestazione tra virgolette. Quindi, supponiamo che tu abbia scritto un file di intestazione chiamato myfile.h , quindi questo è un esempio di come myfile.h la direttiva include per includere quel file:

#include "myfile.h"



  #include <filename>   (1)     
  #include "filename"   (2)

#include include include il file sorgente, identificato dal nome del file, nel file sorgente corrente sulla linea immediatamente dopo la direttiva.

La prima versione della direttiva cerca solo le directory standard incluse. La libreria standard C ++, così come la libreria C standard, è inclusa implicitamente nelle directory standard di inclusione. Lo standard include le directory che possono essere controllate dall'utente attraverso le opzioni del compilatore.

La seconda versione cerca dapprima la directory in cui si trova il file corrente e, solo se il file non viene trovato, cerca le directory di inclusione standard.

Nel caso in cui il file non viene trovato, il programma è mal formato.




When you use #include <filename>, the pre-processor looking for the file in directtory of C\C++ header files (stdio.h\cstdio, string, vector, etc.). But, when you use #include "filename": first, the pre-processor looking for the file in the current directory, and if it doesn't here - he looking for it in the directory of C\C++ header files.




Il #include <filename> viene utilizzato quando si fa riferimento a un file di sistema. Questo è un file di intestazione che può essere trovato in posizioni predefinite di sistema come /usr/include o /usr/local/include . Per i tuoi file che devono essere inclusi in un altro programma devi usare la sintassi #include "filename" .




Secondo lo standard - sì, sono diversi:

  • Una direttiva di pre-elaborazione del modulo

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

    ricerca una sequenza di luoghi definiti dall'implementazione per un'intestazione identificata univocamente dalla sequenza specificata tra i delimitatori < e > e causa la sostituzione di tale direttiva con l'intero contenuto dell'intestazione. Come vengono specificati i posti o l'intestazione identificata è definita dall'implementazione.

  • Una direttiva di pre-elaborazione del modulo

    #include "q-char-sequence" new-line
    

    causa la sostituzione di tale direttiva con l'intero contenuto del file di origine identificato dalla sequenza specificata tra i " delimitatori " .Il file di origine denominato viene cercato in un modo definito dall'implementazione.Se questa ricerca non è supportata o se la ricerca non riesce , la direttiva viene rielaborata come se leggesse

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

    con la sequenza identica contenuta (compresi i caratteri, se ce ne sono) dalla direttiva originale.

  • Una direttiva di pre-elaborazione del modulo

    #include pp-tokens new-line
    

    (che non corrisponde a una delle due forme precedenti) è permesso. I token di preelaborazione dopo l' include nella direttiva vengono elaborati esattamente come nel testo normale. (Ogni identificatore attualmente definito come nome macro viene sostituito dall'elenco sostitutivo dei token di preelaborazione). La direttiva risultante dopo tutte le sostituzioni deve corrispondere a uno dei due moduli precedenti. Il metodo con cui una sequenza di token di preelaborazione tra una coppia di token di preelaborazione < e una > o una coppia di " caratteri è combinata in un token di pre-elaborazione del nome di singola intestazione è definita dall'implementazione.

definizioni:

  • h-char: qualsiasi membro del set di caratteri di origine ad eccezione del carattere di nuova riga e >

  • q-char: qualsiasi membro del set di caratteri sorgente ad eccezione del carattere di nuova riga e "

Si noti che lo standard non indica alcuna relazione tra i modi definiti dall'implementazione. Il primo modulo cerca in un modo definito dall'implementazione e l'altro in un modo (possibilmente altro) definito dall'implementazione. Lo standard specifica anche che alcuni file di inclusione devono essere presenti (ad esempio, <stdio.h> ).

Formalmente dovresti leggere il manuale per il tuo compilatore, tuttavia normalmente (per tradizione) il modulo #include "..." cerca nella directory del file in cui è stato trovato prima #include e poi nelle directory che il #include <...> ricerche di modulo (il percorso di inclusione, ad esempio le intestazioni di sistema).




Alcune buone risposte qui fanno riferimento allo standard C ma hanno dimenticato lo standard POSIX, in particolare il comportamento specifico del comando c99 (ad esempio, compilatore C) .

Secondo The Open Group Base Specifications numero 7 ,

-I directory

Modificare l'algoritmo per la ricerca di intestazioni i cui nomi non sono nomi assoluti da cercare nella directory indicata dal nome della directory prima di cercare nei soliti posti. Pertanto, le intestazioni i cui nomi sono racchiusi tra virgolette ("") devono essere cercati per primi nella directory del file con la riga #include , quindi nelle directory denominate in -I opzioni e l'ultima nei soliti posti. Per le intestazioni i cui nomi sono racchiusi tra parentesi angolari ("<>"), l'intestazione deve essere cercata solo nelle directory denominate in -I opzioni e quindi nei soliti posti. Le directory denominate in -I opzioni devono essere ricercate nell'ordine specificato. Le implementazioni supportano almeno dieci istanze di questa opzione in una singola chiamata di comando c99 .

Quindi, in un ambiente conforme a POSIX, con un compilatore C compatibile con POSIX, #include "file.h" probabilmente ./file.h prima, dove . è la directory in cui è il file con l'istruzione #include , mentre #include <file.h> , è probabile che prima /usr/include/file.h , dove /usr/include è il tuo sistema definito come intestazioni (sembra non definito da POSIX).




#include <file> tells the compiler to search for the header in its includes directory, eg for MinGW the compiler would search for file in C:\MinGW\include\ or wherever your compiler is installed.

#include "file" tells the compiler to search the current directory (ie the directory in which the source file resides) for file .

You can use the -I flag for GCC to tell it that, when it encounters an include with angled brackets, it should also search for headers in the directory after -I . For instance, if you have a file called myheader.h in your own directory, you could say #include <myheader.h> if you called GCC with -I . (indicating that it should search for includes in the current directory.)




#include <filename>

will find the corresponding file from the C++ library. it means if you have a file called hello.h in the C++ library folder, #include <hello.h> will load it.

Ma,

#include "filename"

will find the file in the same directory where your source file is.

In addition,

#include "path_to_file/filename"

will find the file in the directory which you typed in path_to_file .




Almeno per la versione GCC <= 3.0, il modulo parentesi angolare non genera una dipendenza tra il file incluso e quello incluso.

Pertanto, se si desidera generare regole di dipendenza (utilizzando l'opzione GCC -M per l'esempio), è necessario utilizzare il modulo quotato per i file che devono essere inclusi nell'albero delle dipendenze.

(Vedi http://gcc.gnu.org/onlinedocs/cpp/Invocation.html )




#include <filename>

viene utilizzato quando si desidera utilizzare il file di intestazione del sistema C / C ++ o le librerie del compilatore. Queste librerie possono essere stdio.h, string.h, math.h, ecc.

#include "path-to-file/filename"

viene utilizzato quando si desidera utilizzare il proprio file di intestazione personalizzato che si trova nella cartella del progetto o da qualche altra parte.

Per ulteriori informazioni sui preprocessori e l'intestazione. Leggi C - Preprocessors .




Related