2016-08-03 8 views
1

Angenommen, Sie definieren eine Funktion innerhalb der Übersetzungseinheit mit dem Namen der Funktion, die exakt mit einer der Standardbibliotheksfunktionen übereinstimmt. Da der Compiler zuerst nach der Definition in den Übersetzungseinheiten und dann in der Bibliotheksdatei sucht, wird dies auch dazu führen, dass die eigene Version der Funktionsdefinition verwendet wird oder wird eine Diagnose ausgelöst?reserviert C++ auch die Namen der Standardbibliotheksfunktion?

+5

Das klingt wie ein Symptom mit 'using namespace std;'. Wenn Sie das verwenden [bitte stoppen] (http://stackoverflow.com/questions/1452721/why-isusing-namespace-std-in-c-considered-bad-practice). – NathanOliver

+0

Wenn Sie einen eigenen Namespace verwenden, können Sie die stl-Funktionsnamen wiederverwenden. z.B. 'Meinenamensraum {Ostream & Cout (String str) ...}'. Dann können Sie Ihren Namespace mit dem Scope-Auflösungsoperator (: :) verwenden, um anzugeben, welchen Cout Sie verwenden möchten. – pjcognetta

+0

"Exakt passend", da Sie neue Symbole im 'std'-Namespace einführen? Dies ist ausdrücklich verboten durch §17.6.4.2.1: * "Das Verhalten eines Programms ist undefiniert, wenn es Deklarationen oder Definitionen zum Namensraum' std' "* hinzufügt.Sie dürfen jedoch Vorlagen für Benutzertypen spezialisieren. – peppe

Antwort

2

Nein, die Namen der Funktionen im Namespace std sind nicht reserviert - zumindest nicht in dem Sinne, dass die Verwendung der gleichen Namen außerhalb des Namespace std verboten ist.

Das Platzieren von Namen im Namespace std (außer in einigen Fällen, z. B. bei der Spezialisierung bestimmter Vorlagenfunktionen) führt jedoch zu undefiniertem Verhalten.

Wenn der Compiler sich über Unklarheiten beschwert, wenn er Ihre Funktionen aufruft, wobei eine der Funktionen den gleichen Namen wie Sie hat, aber im Namensraum std ist, dann liegt wahrscheinlich eine using namespace std in Ihrem Code vor. Der Effekt davon, wenn der Compiler auf einen Namen stößt, ist, dass sowohl Ihre Funktionen als auch die im Namespace std gültige Übereinstimmungen sind. Wenn der Compiler keinen Grund hat, einen der anderen vorzuziehen (z. B. akzeptieren sie dieselben Arten von Argumenten), wird der Code nicht kompiliert. In diesem Fall besteht die Lösung darin, den Code using namespace std aus Ihrem Code zu entfernen - es gibt keine Möglichkeit, die Auswirkungen von using namespace std rückgängig zu machen, anstatt sie zu entfernen.

2

Ich bin mir nicht sicher, ob ich die Frage richtig (korrigiert mich wenn ich falsch bin) verstehen aber sagen, Sie haben eine Funktion wie so:

void sort(// blah blah 

Oder erklärt den std-Namespace using namespace std(which you should not be doing)

Wenn Sie innerhalb Ihrer Übersetzungseinheit sort(...) aufrufen, überlädt der Compiler die Definitionen und in diesem Fall hat Ihre Funktion Vorrang.

Aber wenn Sie die Standard-Bibliothek Funktion aufrufen, indem Sie den std-Namespace explizit zu definieren (mit dem Operator Umfang Auflösung) wie so

std::sort(// blah blah 

es wird die std Library-Funktion stattdessen verwenden.

+0

@HolyBlackCat Ich weiß nicht, warum 'Puthar' dieses Verhalten hat, aber für mich sollte Ihr Code nicht funktionieren, siehe http://ideone.com/EXJ50I. – Holt

+1

Die Standardbibliothek hat keinen besonderen Vorrang. Wenn das 'sort' von' std' mit 'using namespace std' eingezogen wird und es auch eine benutzerdefinierte Funktion namens' sort' gibt, gelten die üblichen Überladungsregeln. –

+0

@ialcuaz - nein, das stimmt nicht. Der Compiler übernimmt das Überladen zum Zeitpunkt des Aufrufs und betrachtet alle Deklarationen im Gültigkeitsbereich. Es ist egal, wie sie dort hingekommen sind. –

0

Das ist der Grund, warum Leute sagen using namespace std; in C++ ist eine schlechte Praxis.

Da die Funktionsdefinition in Konflikt gerät, wenn Sie denselben Funktionsnamen verwenden, der bereits in namespace std definiert ist und zu vielen nicht zusammenhängenden Fehlern führt.

dieses Themas Lesen Sie für weitere Informationen: -

Why using namespace std; in C++ is considered a bad practice?