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?
Antwort
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.
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.
@HolyBlackCat Ich weiß nicht, warum 'Puthar' dieses Verhalten hat, aber für mich sollte Ihr Code nicht funktionieren, siehe http://ideone.com/EXJ50I. – Holt
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. –
@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. –
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?
- 1. Warum kann ich diese C++ - Standardbibliotheksfunktion ohne std :: qualifier aufrufen?
- 2. Chrome reserviert Speicherplatz für Bildlaufleiste, auch wenn es ausgeblendet ist
- 3. Wie reserviert Enum Speicher auf C?
- 4. Namen der C-Sprachfamilie
- 5. Azure Website Reserviert IP
- 6. Reserviert Teil des Desktops
- 7. C#: Abrufen der Namen der installierten Bildschirmschoner
- 8. Schienen reserviert Klassennamen
- 9. Hat Java einen generischen Test für die Gleichheit, der auch Nullen behandelt?
- 10. Warum reserviert der Compiler nicht genügend Speicherplatz auf dem Stack?
- 11. how System entfernen reserviert Partition
- 12. C-Code, auch {}
- 13. Jemand verwendet den Namen der Struktur auch als Variablennamen. Was sagt der Code wirklich?
- 14. C-Standardbibliotheksfunktion, um zu prüfen, ob ein char * ein Wort ist?
- 15. C# reversierende Namen
- 16. PHP-Regex für die Überprüfung der Namen
- 17. Hat Mysql Text DataType Speicherplatz reserviert
- 18. Browserify: SyntaxError: Das Schlüsselwort 'let' ist reserviert
- 19. Wie ist der Speicher für eine statische Variable reserviert?
- 20. Wie reserviert ein großes Array Speicher?
- 21. Ist mehr Platz für Variantensätze reserviert?
- 22. Die ‚<‘ Operator ist für zukünftige Anwendungen reserviert
- 23. Warum ist die Speicheradresse 0x0 reserviert und wofür?
- 24. Wo ist der Speicher reserviert, wenn ich dieses Array erstelle? (C)
- 25. Parsing-Fehler Der Schlüsselwort-Import ist reserviert (SublimeLinter-contrib-eslint)
- 26. Warum reserviert die Cuda-Laufzeit 80 GiB virtuellen Speicher bei der Initialisierung?
- 27. Übergabe Parameter, der den gleichen Namen der Klassenfeldvariablen in C#
- 28. cvs checkin: Identifizieren der Namen der Dateien, die überprüft wurden
- 29. Rails: has_many, aber auch has_one unter einem anderen Namen
- 30. Name wird bereits von Ruby on Rails verwendet oder reserviert?
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
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
"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