2017-02-24 2 views
0

Um Strings verwenden zu können, muss ich den String-Header einschließen, damit seine Implementierung verfügbar wird. Aber wenn das so ist, warum muss ich noch die Zeile using std::string hinzufügen?Warum wird nach #include <string> noch std :: string benötigt?

Warum weiß es den String-Datentyp noch nicht?

#include <string> 

using std::string; 

int main() { 
    string s1; 
} 
+0

Legen Sie eine Linie Strings using namespace std und die Verwendung direkt Ist –

+6

nicht so schlimm Praxis? Ich versuche 'using' nur für Dinge zu verwenden, die ich brauche. – vanmarcke

+5

@vanmarcke das ist eine schlechte Übung, du hast es richtig benutzt. – mpiatek

Antwort

5

Da string im Namensraum std genannt definiert ist.

Sie std::string überall schreiben können, wo <string> enthalten ist, aber Sie können using std::string hinzufügen und nicht Namespace in dem Bereich verwenden (so std::string könnte als string reffered werden). Sie können innerhalb der Funktion es zum Beispiel platzieren und dann gilt es nur für diese Funktion:

#include <string> 

void foo() { 
    using std::string; 

    string a; //OK 
} 

void bar() { 
    std::string b; //OK 
    string c; //ERROR: identifier "string" is undefined 
} 
+1

, so dass die Zeichenfolge nicht im String-Header definiert ist? – vanmarcke

+2

@vanmarcke ist es im String-Header im std-Namespace definiert. Sehen Sie sich die Links am Ende meiner Antwort an. – mpiatek

1

Namespace ist ein zusätzliches Merkmal von C++, die den Umfang einer Variablen, Funktion oder ein Objekt zu definieren und den Namen Kollision zu vermeiden . Hier ist das Objekt string im Namensraum std definiert.

std ist der Standardnamespace. cout, cin, string und viele andere Dinge sind darin definiert.

Die Kopfzeile <string> deklariert die verschiedenen Entitäten, die sich auf die Zeichenfolgenbibliothek beziehen, während Namespaces dazu verwendet werden, verwandte Funktionen zu gruppieren und die Verwendung der gleichen Namen in verschiedenen Namespaces zuzulassen.

2

Da sich die Deklaration der Klasse string im Namespace std befindet. Sie müssen also entweder immer über std :: string darauf zugreifen (müssen Sie dann nicht verwenden) oder tun es wie Sie.

7

using std::string; bedeutet nicht, dass Sie diesen Typ jetzt verwenden können, aber Sie können diesen Typ verwenden, ohne den Namespace std:: vor dem Namen des Typs angeben zu müssen.

Der folgende Code korrekt ist:

#include <string> 

int main() 
{ 
    std::string s1; 
    return 0; 
} 
Verwandte Themen