[C++] Vom Anfänger zum Meister Teil 4 – Namespace

Namensräume

Namensraum definieren

Definitionsformat:
Um einen Namespace zu definieren, müssen Sie das Schlüsselwort namespace verwenden

Namespace-Name
{ Definition von Konstanten, Variablen, Funktionen und anderen Objekten

 namespace name1
  {
    
    
      int names = 12;
      int age   = 32;
  }

Die Bedeutung dieses Codes besteht darin, dass die beiden Variablen Namen und Alter zum Namespace Name1 gehören.
Wie verwenden wir diese beiden Variablen?
Die allgemeine Verwendungsform lautet wie folgt:

Namespace::Member;
Zum Beispiel:

name1::age = 20;

Wie spiegelt sich Einzigartigkeit wider? Das folgende Beispiel zeigt, dass die im Namespace enthaltenen Variablenmitglieder eindeutig sind

  1 #include<iostream>
  2 using namespace std;
  3 namespace name1
  4 {
    
    
  5     int names = 12;
  6     int age   = 32;
  7 }
  8 namespace name2
  9 {
    
    
 10     int names = 20;
 11     int age   = 325;
 12 }
 13 int age = 6;
 14 int main()
 15 {
    
    
 16     cout<<"name1 :names = "<<name1::names<<" : age = "<<name1::age<<endl;
 17     cout<<"name2 :names = "<<name2::names<<" : age = "<<name2::age<<endl;
 18     cout<<" age = "<<age<<endl;
 19     return 0;
 20 }

Ergebnis:

[bsk@localhost c++]$ g++ namespace.cpp 
[bsk@localhost c++]$ ./a.out 
name1 :names = 12 : age = 32
name2 :names = 20 : age = 325
age = 6


Es ist ersichtlich, dass Variablen mit demselben Namen in verschiedenen Namespaces unterschiedlich sind. Und globale Variablen und Namespace-Variablen sind nicht dasselbe.

Verwenden Sie Namensräume

In mehreren Dateien derselben Anwendung sind manchmal globale Objekte mit demselben Namen vorhanden, was zu Verknüpfungsfehlern in der Anwendung führen kann. Ein Namespace ist ein benannter Bereich, in dem alle vom Programmierer erstellten Bezeichner eindeutig sind.
Die Verwendung von Namespaces ist der beste Weg, Namenskonflikte zu beseitigen!

  1 #include<iostream>
  2 using namespace std;
  3 namespace name1
  4 {
    
    
  5     int names = 12;
  6     int age   = 32;
  7 }
  8 namespace name2
  9 {
    
    
 10     int names = 12;
 11     int age   = 325;
 12 }
 13 
 14 int main()
 15 {
    
    
 16 
 17     return 0;
 18 }
~     

Wie im obigen Code gezeigt, haben die beiden int-Variablen name und age zwar denselben Namen, stammen aber aus unterschiedlichen Namespaces, sodass sie nicht in Konflikt geraten und somit die Eindeutigkeit des Bezeichners gewährleistet sind.

Durch die Verwendung von Namespaces können Variablen mit demselben Namen so definiert werden, dass sie unterschiedliche Werte darstellen, und Referenzen können korrekt angezeigt werden. Tatsächlich gibt es auch eine Möglichkeit, auf Mitglieder im Namespace zu verweisen. Verwenden Sie einfach die using-Namespace-Anweisung
Allgemeines Format:

Verwenden des Namensraums Namensraumname

Zum Beispiel verwenden wir üblicherweise den using-Namespace std;
Mit der using-namespace-Anweisung können Sie sie direkt verwenden, wenn Sie auf Mitglieder im Space verweisen.

  1 #include<iostream>
  2 using namespace std;
  3 namespace name1
  4 {
    
    
  5     int names = 12;
  6     int age   = 32;
  7 }
  8 using namespace name1;
  9 namespace name2
 10 {
    
    
 11     int names = 20;
 12     int age   = 325;
 13 }
 14 int main()
 15 {
    
    
 16     cout<<" name1 : names= "<<names<<" age = "<<age<<endl;
 17     cout<<"name2 :names = "<<name2::names<<" : age = "<<name2::age<<endl;
 18     return 0;
 19 }
~      
[bsk@localhost c++]$ ./a.out 
 name1 : names= 12 age = 32
name2 :names = 20 : age = 325

Das Laufergebnis ist das gleiche wie oben. Es gibt jedoch noch einen weiteren Nachteil: Wenn wir die Anweisung „using namespace“ zur Verwendung des Namespace verwenden und mehrere Namespaces definieren, die zufällig dieselben Bezeichnermitglieder (dieselben Variablennamen) haben, kommt es zu Mehrdeutigkeiten. Daher ist es derzeit am besten, Bereichsqualifizierer als Referenz zu verwenden.
Wie im folgenden Fehler gezeigt:

namespace.cpp: In function ‘int main()’:
namespace.cpp:17:31: error: reference to ‘names’ is ambiguous
     cout<<" name1 : names= "<<names<<" age = "<<age<<endl;
                               ^
namespace.cpp:11:9: note: candidates are: int name2::names
     int names = 20;
         ^
namespace.cpp:5:9: note:                 int name1::names
     int names = 12;
         ^
namespace.cpp:17:49: error: reference to ‘age’ is ambiguous
     cout<<" name1 : names= "<<names<<" age = "<<age<<endl;
                                                 ^
namespace.cpp:12:9: note: candidates are: int name2::age
     int age   = 325;
         ^
namespace.cpp:6:9: note:                 int name1::age
     int age   = 32;
         ^
namespace.cpp:18:29: error: reference to ‘names’ is ambiguous
    cout<<" name2:: names="<<names<<endl;
                             ^
namespace.cpp:11:9: note: candidates are: int name2::names
     int names = 20;
         ^
namespace.cpp:5:9: note:                 int name1::names
     int names = 12;

Namespace in mehreren Dateien definieren

Bei der Definition eines Namespace werden Funktionen im Namespace normalerweise in der Header-Datei und Funktionen im Namespace in der Quelldatei deklariert, um die Deklaration und die Implementierung des Programms zu trennen.

Kopfdatei:

namespace output
{
    
    
	void test(); //声明函数
}

Quelldatei:

void  output::test()
{
    
    
	cout<<"this is test"<<endl;
}

Definieren Sie verschachtelte Namespaces

namespace output
{
    
    
	void show()
	{
    
    
		cout<<"output function"<<endl;
	}
	namespace myname
	{
    
    
		void demo()
		{
    
    
			cout<<"my name function"<<endl;
		}
	}
}

Im obigen Code wird im Ausgabe-Namespace ein weiterer Namespace myname definiert. Wenn das Programm auf das Namespace-Objekt myname zugreift, kann es den äußeren und inneren Namespace als Präfixe verwenden.

Ausgabe::meinName::Demo();

Welchen Namespace verwendet Ihrer Meinung nach die using namespace-Ausgabe::myname;
-Anweisung? Tatsächlich bezieht sich die obige Anweisung nur auf den in der Ausgabe verschachtelten MyName-Namespace und nicht auf den Ausgabe-Namespace, sodass die Show-Funktion unter dem Ausgabe-Namespace nicht aufgerufen werden kann.

unbenannter Raum

namespace
{
    
    
int age = 10;
}

Im unbenannten Namespace definierte Bezeichner werden als globaler Namespace festgelegt, was gegen das Einstellungsprinzip des Namespace verstößt, sodass der unbenannte Raum nicht an Popularität gewonnen hat.

Supongo que te gusta

Origin blog.csdn.net/2202_75623950/article/details/134293750
Recomendado
Clasificación