2012-03-31 3 views
0

Was sind die Unterschiede in Kompilierbarkeit oder generierten Code (falls vorhanden) zwischen den beiden folgenden Quelldateien:"using Namensraum std;" vor "# include <foo>"

Exhibit A:

namespace std {}; 
using namespace std; 
#include <vector> 
#include <string> 

<any code here> 

Exhibit B:

#include <vector> 
#include <string> 
using namespace std; 

<any code here> 

Angenommen, die beiden <any code here> Platzhalter werden durch identische ersetzt Benutzercode.

Anders ausgedrückt: Gibt es einen sichtbaren Unterschied zwischen Benutzern, wenn "namespace std;" wird vor den Standard #includes gestellt (unter der Annahme, Namespace std wurde wie oben eingeführt)?

+2

Ich bin neugierig, warum Sie das gefragt haben. – Pubby

+0

Als erstes ist "Exhibit A" in C++ illegal: Sie dürfen den 'std'-Namespace nicht wieder öffnen. –

+0

@ AndréCaron: Haben Sie eine Standardreferenz dafür? –

Antwort

5

So unwahrscheinlich es auch sein mag, könnte der folgende Code möglicherweise in Ihrer Implementierung der Vektor-Header sein:

namespace __AA 
{ 
    class vector {}; 
} 

namespace std 
{ 
    // actual std::vector implementation here 
} 

namespace __BB 
{ 
    using namespace __AA; 
    vector x; 
} 

Jetzt mit Exhibit A, haben Sie eine Zweideutigkeit bekommen.

1

In jeder praktischen Standardbibliotheksimplementierung gibt es keinen Unterschied, da die using-Direktive keine Auswirkungen auf Definitionen innerhalb des Namespace std hat (da std bereits der aktuelle Bereich ist).

Wenn eine Standard-Bibliothek Implementierung war negativ beeinflusste oder so, ich halte es für einen ernst Quality-of-Implementierung Defekt.

Verwandte Themen