Esiste un caso d'uso valido per l'utilizzo della direttiva namespace?

3

Ho esaminato alcuni dei miei vecchi codici e ho scoperto che stavo usando la direttiva using namespace . Da quello che ho letto su molti risultati di Google, sembra che non sia mai una buona idea usarlo. Esiste davvero un caso d'uso valido per questo costrutto o è stato solo un tentativo fuorviante di rendere la vita delle persone più facile, che non è andata a buon fine?

    
posta Hakaishin 20.01.2018 - 15:32
fonte

2 risposte

3

Sì, certamente ci sono usi validi per using namespace -directive.

Ad esempio, se si desidera utilizzare valori letterali definiti dall'utente, gli operatori devono essere in ambito, quindi:

using namespace std::literals;

O forse solo

using namespace std::string_literals;

Generalmente, using namespace è inconcepibile quando non si conoscono i contenuti esatti, ora e in futuro, del rispettivo spazio dei nomi. Se lo fai, stai bene. Ma il poster-child di using namepace -abuse, namespace std , è troppo grande, amorfo e mutevole per considerarlo.

    
risposta data 20.01.2018 - 15:39
fonte
3

La direttiva using namespace è utile quando hai spazi dei nomi che identificano il tuo progetto.

Supponiamo che tu abbia un progetto che utilizza gli spazi dei nomi developerIdentifier::projectName . Quel progetto ha una classe exampleClass e un insieme di funzioni di utilità sotto lo spazio dei nomi utils . I nomi completi di questi sono developerIdentifier::projectName::exampleClass e developerIdentifier::projectName::utils .

Hai lo stub dell'intestazione exampleClass.hpp :

#include "utils.hpp"

namespace developerIdentifier {
namespace projectName {
class exampleClass
{
public:
    void function1();
    void function2();
};
}
}

Il file di implementazione di corrispondenza exampleClass.cpp ha using namespace developerIdentifier::projectName; scritto in alto:

using namespace developerIdentifier::projectName;

void exampleClass::function1() { return utils::frobnicate(1, 2); };
void exampleClass::function2() {};

Poiché questa dichiarazione di using namespace è nel file di implementazione, non inquinerà il namspace di alcuna classe che importa exampleClass.hpp .

Questa dichiarazione ha due vantaggi:

  1. Non devi scrivere firme di funzioni completamente qualificate come void developerIdentifier::projectName::exampleClass::function1() in exampleClass.cpp .
  2. Non devi qualificare completamente developerIdentifier::projectName::utils::frobnicate() in function1() .
risposta data 20.01.2018 - 18:59
fonte

Leggi altre domande sui tag