2010-07-01 12 views
168

Eventuali duplicati:
What is the difference between #include <filename> and #include “filename”?Differenza tra parentesi angolare < > e virgolette "" mentre includono i file di intestazione in C++?

Qual è la differenza tra parentesi angolare < > e virgolette " " mentre inclusi i file di intestazione C++?

Voglio dire quali file devono essere inclusi utilizzando ad esempio: #include <QPushButton> e quali file devono essere inclusi utilizzando ad esempio: #include "MyFile.h" ???

+4

Questo è un duplicato esatto di http: // StackOverflow.it/questions/21593/what-is-the-difference-between-include-filename-and-include-filename, anche se la risposta top in quella è errata (ha a che fare con le posizioni che il preprocessore cerca, ma la spec DEFINE DEFINE THIS LOCATIONS: la directory corrente è una convenzione, non un requisito). –

risposta

189

Dipende dal compilatore. Detto questo, in generale l'utilizzo di " dà la priorità alle intestazioni nella directory di lavoro corrente rispetto alle intestazioni di sistema. <> di solito viene utilizzato per le intestazioni di sistema. Dal alla specifica (Sezione 6.10.2):

Una direttiva al preprocessore della forma

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

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

Una direttiva al preprocessore della forma

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

provoca la sostituzione della stessa entro 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 fallisce, la direttiva viene rielaborato come se letta

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

con la sequenza contenuta identico (compresi > caratteri, se del caso) dalla direttiva originaria .

Così il maggior parte compilatori, utilizzando i primi "" controlli directory locale, e se non trova una corrispondenza passa poi per controllare i percorsi di sistema. L'utilizzo di <> avvia la ricerca con le intestazioni di sistema.

+1

+1 Informazioni utili. – fingerprint211b

+2

Cosa intendi per "directory di lavoro corrente"? AFAIK le virgolette danno la priorità alla directory in cui vive il file che sta usando tale direttiva. –

+0

@ Craig, sì hai ragione. Ho scritto qualcosa di diverso da quello che intendevo: un effetto collaterale del sistema di build su cui ho lavorato ultimamente è che i due sono sempre gli stessi. –

36

Quando si utilizzano le parentesi angolari, il compilatore cerca il file nell'elenco dei percorsi di inclusione. Quando si usano le virgolette doppie, per prima cosa cerca nella directory corrente (cioè la directory in cui è compilato il modulo) e solo dopo cercherà l'elenco dei percorsi di inclusione.

Quindi, per convenzione, si usano le parentesi angolari per gli standard include e le virgolette per tutto il resto. Ciò garantisce che nel caso (non consigliato) in cui si abbia un'intestazione locale con lo stesso nome di un'intestazione standard, verrà scelto quello giusto in ciascun caso.

Problemi correlati