In C++ Qual è la differenza tra la direttiva #include
e using namespace
? Inoltre memorizzi i tuoi spazi dei nomi come file separati e qual è l'estensione di file per tali file?C++: utilizzo di namespace e #include
risposta
Per rispondere alla domanda, tornerò un po 'indietro e prendo alcune nozioni di base di C e C++.
Durante la compilazione di C/C++, la compilazione dei file di origine in un eseguibile reale è in realtà due fasi, la compilazione e il collegamento. La fase di compilazione prende un file .cpp alla volta e lo compila. Il contenuto di altri file .cpp non è visibile al compilatore. Questo genera un "file oggetto" (non so perché si chiama così). Tutti i file oggetto sono quindi collegati dal linker per produrre l'eseguibile finale.
Questo introduce due concetti importanti in C++, dichiarazioni e definizioni. Una dichiarazione specifica che qualcosa (una variabile o una funzione) esiste da qualche parte. Quello che segue è la dichiarazione della funzione Foo()
void Foo();
Questo significa che abbiamo detto al compilatore che da qualche parte ci sarà una funzione Foo() che non prende argomenti e restituire alcun valore.
Una definizione specifica quale funzione esegue effettivamente. Qui la funzione è definita
void Foo() { cout << "Foo!!"; }
Consente di definire un'altra funzione, Bar()
void Bar() {
Foo();
cout << "bar";
}
Questa funzione chiamate di funzione Foo(). Questa funzione non può essere compilata se la funzione foo non è già stata dichiarata o definita precedentemente nello stesso file. Quindi la dichiarazione non produce di per sé alcun codice compilato.Devono essere lì.
Se la funzione Foo() non è definita in questo file, ma un diverso file .cpp, allora è il lavoro del linker effettuare la connessione tra queste due funzioni. Se la funzione Foo(), non è definita ovunque, si otterrà un errore del linker, non un errore del compilatore.
Questo arriva al concetto di file di intestazione. I file di intestazione sono il luogo in cui vengono archiviate le dichiarazioni. Quando si usa # include per includere il contenuto del file di intestazione, allora ciò che accade in realtà è che il preprocessore (un passo che viene eseguito prima del compilatore vero e proprio) carica il file incluso e "incolla" il contenuto nel file sorgente originale. Quindi il compilatore vedrà il file come se l'intero file di intestazione fosse effettivamente incollato nel file C++.
Così, quando si programma in C++, è di norma inserire il vostro definizioni in file cpp, e potrete inserire il vostro dichiarazioni nei file .h
namespace d'altra parte è semplicemente un modo per raggruppare logicamente il codice .
Quindi no, gli spazi dei nomi non sono archiviati in file separati e non hanno un'estensione di file specifica. Se avessi un progetto con più spazi dei nomi, potrei creare una directory separata per ogni spazio dei nomi (e poi ancora, forse no, dipenderebbe dalla situazione).
In C++, #include
viene utilizzato per aggiungere file al progetto, mentre namespace
viene utilizzato per mantenere i vostri oggetti in moduli logici (spazio dei nomi non si applica a C)
Ad esempio, si potrebbe avere una classe vettore in un file "vector.h
" così lo includi nel tuo progetto.
vettore è una parte di una grande biblioteca (la libreria standard) STD, in modo da poter accedere con
std::vector
Tuttavia, poiché i programmatori sono pigri e non vogliono scrivere std :: tutto il posto (la libreria standard ha molte molte parti molto utili), è possibile scrivere
using namespace std
nella parte superiore del file. Questo dirà al compilatore che ogni volta che vede un tipo (come il vettore), controlla anche nello spazio dei nomi std perché la definizione potrebbe essere lì. In questo modo, le seguenti affermazioni diventano equivalenti.
std::vector
vector
In vector.h, si dovrebbe vedere qualcosa di simile
namespace std
{
class vector { /* Implementation */ }
}
Così #include
è aggiungere i file, mentre using namespace
è quello di mantenere il vostro pulitore di codice e confezionato nelle biblioteche "significativi". È possibile omettere using namespace
durante la programmazione, ma è assolutamente necessario il #include
- 1. Namespace PHP e Include() con classi
- 2. Namespace e C++
- 3. namespace Xml e C# csproj
- 4. Interazione di namespace e friend in C++?
- 5. comprensione namespace C
- 6. XAML clr-namespace - utilizzo incompatibilità?
- 7. Twig embed vs include, qualsiasi motivo di utilizzo include
- 8. "using namespace" nelle intestazioni C++
- 9. C++ namespace collisione con GTEST e dare impulso
- 10. Utilizzo di Rcpp con specifiche di Windows include
- 11. Sovraccarico dell'operatore C++ e namespace associato
- 12. c Namespace ++ mal di testa
- 13. PHP Namespace e interfacce
- 14. serializzazione XML + Namespace (C#)
- 15. Accesso al namespace globale C++ dall'interno di un altro namespace
- 16. Utilizzo di @include vs @extend in Sass?
- 17. Namespace Clashing in C++
- 18. Namespace prefix in C#
- 19. C# namespace questions
- 20. Utilizzo di troppo include() in php
- 21. Utilizzo di include per indicare dinamicamente l'HTML
- 22. C++ utilizzando namespace dichiarazione
- 23. std :: make_unique, namespace anonimo e ODR
- 24. Utilizzo di Boost.Spirit.Lex e iteratori di flusso
- 25. #include intestazioni in C/C++
- 26. svcutil.exe e parametro namespace
- 27. namespace anonimi e l'unica regola di definizione
- 28. C++ Dichiarazione di andata e amicizia in Namespace
- 29. differenza tra cgroups e namespace
- 30. Namespace, argparse, e l'uso di
Non ci sono spazi dei nomi in C, modificati solo in C++. –