Quali sono le buone pratiche per includere gli spazi dei nomi in C ++ che evitano una maggiore digitazione?

1

Sto iniziando con C ++ e quasi ovunque vedo che ci sono queste 2 frasi in cima.

#include <iostream>
using namespace std;

Come ho capito, gli spazi dei nomi sono qualcosa per mantenere separati i nomi e hanno gli stessi identificatori in spazi dei nomi diversi. Quindi non è incluso std all'inizio che annulla tutto il duro lavoro di creare spazi dei nomi? Non è meglio avere qualcosa come std::cout quando ho bisogno di una determinata funzione da un determinato spazio dei nomi?

Includerebbe lo spazio dei nomi nella particolare funzione che lo usa come compromesso tra meno digitando ( std::cout vs. cout ovunque) ed evitando i conflitti di nome (abc in foo e abc nella barra evitati usando foo::abc e %codice%)? Qualcosa come

int function_using_abc_namespace(int a)
{
    using namespace abc;
    //Rest of the function
}

Volevo sapere perché è necessario evitare conflitti tra nomi, ma è anche importante evitare ulteriori digitazioni. Se questo non è un buon modo per ottenere una via di mezzo, quali sono le alternative?

    
posta Aseem Bansal 11.08.2013 - 19:41
fonte

4 risposte

7

Risposta aggiornata in base alla domanda aggiornata

Va bene a using namespace std in *.cpp file. Va bene a using namespace std all'interno dei corpi delle funzioni.

Motivo: in entrambi i casi, non sono contagiosi. Contagiosità è l'unica ragione per cui non dovrebbero essere usati al livello di spazio dei nomi globale nei file di intestazione.

I progetti C ++ a file singolo (con un solo file *.cpp , senza intestazioni, ad esempio in puzzle di programmazione e programmazione competitiva) possono usarli liberamente.

Risposta originale

L'unica regola complessa con using namespace std; in C ++ è questa:

  • Non inserire questo in un file di intestazione, se questo file di intestazione deve essere incluso da più file di origine (*.cpp) .
    • Motivo: è contagioso.

Oltre a questo, suggerisco di adottare un approccio pragmatico:

  • Consenti l'importazione di spazi dei nomi a condizione che non provochi un avviso / ambiguità / conflitto del compilatore.

Questo fa sorgere la domanda: qual è il vero vantaggio di avere spazi dei nomi? La semplice risposta è disambiguazione. Ma disambiguazione per chi è in vantaggio?

  • Disambiguazione per i programmatori?

    • Questo è un vantaggio relativamente minore, perché la maggior parte dei programmatori è già abituata alla programmazione orientata agli oggetti e la denominazione di oggetti è già sufficiente per raccontare la categoria e lo scopo di tale oggetto.
      • Tuttavia, solo l'umano può avere senso dal nome degli oggetti - i computer non possono. (Vedi il prossimo punto sugli strumenti automatici.)
    • La mente umana è eccellente nel risolvere l'ambiguità tenendo conto del contesto e della conoscenza del dominio.
  • Disambiguazione per strumenti automatici, come compilatori, generatori automatici di commenti alla documentazione (Javadoc, Doxygen, ecc.) e strumenti di refactoring automatico?

    • Direi che questo è un motivo più importante per usare gli spazi dei nomi.
    • Inserendo oggetti in spazi dei nomi, gli strumenti automatici possono presentare gruppi di oggetti come interrelati.
    • Questo aiuta l'organizzazione gerarchica delle documentazioni di classe, l'applicazione delle regole di visibilità del pacchetto e molte altre cose pulite.

Pertanto, fintanto che non causa un conflitto, sentiti libero di importare spazi dei nomi.

    
risposta data 11.08.2013 - 22:41
fonte
1

In genere si consiglia di non avere using namespace std . I libri lo fanno (di solito con una spiegazione) solo per brevità. Allo stesso modo per altri spazi dei nomi, ma ci sono casi in cui potresti ragionevolmente non essere d'accordo, e usarlo comunque.

    
risposta data 11.08.2013 - 21:05
fonte
1

Un principio molto valido che emerge molto è che se hai intenzione di fare in modo che la persona successiva debba imparare qualcosa, allora assicurati che riescano ad ammortizzare quella conoscenza per molti usi.

Ciò significa che using namespace std dovrebbe far parte di uno standard di codifica. O impari che qualsiasi cosa da std è disponibile, e tu benefici ovunque. O non lo impari, ma devi digitare std ovunque. Entrambe le posizioni sono difendibili.

Lo stesso principio vale per il tuo codice interno. È OK avere using namespace Foo nel tuo progetto, ma ci dovrebbe essere un numero limitato di spazi dei nomi che importi in quel modo. E quella lista dovrebbe essere importata ovunque. Esatto in modo che tutti i membri del progetto siano costretti a scoprire cosa c'è in Foo e possono quindi beneficiare ripetutamente. Ma sii molto cauto nell'aumentare questa lista - le persone che sono inclini a farlo sono le persone che conoscono meglio il tuo codice e che quindi hanno la minima consapevolezza di com'è per le persone che stanno imparando il tuo codice. Se sei sul recinto, sbaglia sempre sul lato dell'essere espliciti.

Questo generalizza molto più lontano. Ogni volta che stai creando un progetto, la cosa è lunga e difficile su ciò che le persone che lavorano con il progetto devono sapere. Annota questa lista. Pensaci bene ad aggiungerlo. Ma tutto ciò che viene aggiunto a quella lista, dovrebbe essere usato pesantemente in modo da ottenere il massimo valore dall'apprendimento forzato.

    
risposta data 11.08.2013 - 21:34
fonte
0

Non c'è niente di sbagliato nell'importazione di spazi dei nomi di per sé, o non sarebbe possibile.

Il problema inizia quando si importano gli spazi dei nomi con identificatori e spazi dei nomi comunemente usati e quindi probabilmente in conflitto con contenuto fluido o sotto-specificato.

E ::std è uno di questi spazi dei nomi che è aperto alla crescita senza preavviso, rendendo ambigui i costrutti in precedenza ambigui o, peggio, cambiando in silenzio il modo in cui un nome viene risolto.

Quindi, non usare mai using namespace std; , ma non temere using namespace std::literals o using std::cout .

Inoltre, ricorda che C ++ ha ADL quindi la maggior parte delle chiamate non devono essere qualificate.

    
risposta data 10.11.2016 - 11:05
fonte

Leggi altre domande sui tag