C ist etwas, nicht genau, eine Teilmenge von C ++. Daher können wir die meisten C-Funktionen / Header in C ++ verwenden, indem wir den Namen ein wenig ändern ( stdio.h
to cstdio
, stdlib.h
to cstdlib
).
Meine Frage ist eigentlich eine Art Semantik. In C ++ Code (unter Verwendung der neuesten Version von GCC - Compiler), kann ich anrufen printf("Hello world!");
und std::printf("Hello world!");
und es funktioniert genau gleich. Und in der Referenz, die ich benutze, erscheint es auch als std::printf("Hello world!");
.
Meine Frage ist, ist es bevorzugt, std::printf();
in C ++ zu verwenden? Ist da ein Unterschied?
c++
language-lawyer
std
DeiDei
quelle
quelle
C
Bibliothekssymbolen in den globalen Namespace vorgeschrieben ist, bevorzuge ich die Verwendung derstd::
qualifizierten Versionen. (Außerdem wünschte ich mir, sie hätten es illegal gemacht).Antworten:
Aus dem C ++ 11 Standard (Schwerpunkt Mine):
Wenn die Überschriften «name.h» nicht mehr verwendet werden, wurden sie als Kandidaten für die Entfernung aus zukünftigen Revisionen identifiziert.
Daher würde ich vorschlagen, die Header «cname» einzuschließen und die Deklarationen und Definitionen aus dem
std
Namespace zu verwenden.Wenn Sie aus bestimmten Gründen die Header «name.h» verwenden müssen (veraltet, siehe oben), würde ich empfehlen, die Deklarationen und Definitionen aus dem globalen Namespace zu verwenden.
Mit anderen Worten: bevorzugen
Über
quelle
<cmeow>
liefert immer::std::purr
und kann oder kann nicht liefern::purr
.<meow.h>
liefert immer::purr
und kann oder kann nicht liefern::std::purr
.Verwenden Sie das Formular, das garantiert von der von Ihnen angegebenen Kopfzeile bereitgestellt wird.
quelle
<cmeow>
noch<meow.h>
stellt weder::std::purr
noch ,::purr
sondern ein Pre-Prozessor Fehler. Nur<cstdio>
und / oder<stdio.h>
bietet::std::printf
und / oder::printf
. : Pstrcat
produzieren::purr
.Nein, dir geht es so oder so gut.
Die ursprüngliche Absicht war, dass die
<___.h>
Header die C-Versionen sind, die alles in den globalen Namespace<c___>
einfügen , und die Header die C ++ - ified-Versionen sind, die alles in denstd
Namespace einfügen .In der Praxis fügen die C ++ - Versionen jedoch auch alles in den globalen Namespace ein. Und es gibt keinen klaren Konsens darüber, dass die Verwendung der
std::
Versionen "das Richtige" ist.Verwenden Sie also grundsätzlich das, was Sie bevorzugen. Am häufigsten wird wahrscheinlich die C-Standardbibliotheksfunktion im globalen Namespace (
printf
anstelle vonstd::printf
) verwendet, aber es gibt nicht viel Grund, eine als "besser" als die andere zu betrachten.quelle
Der einzige Unterschied besteht darin, dass Sie sich
std::printf()
durch Hinzufügen einerstd::
Bereichsauflösung in Zukunft vor jemandem schützen, der eine Funktion mit demselben Namen schreibt, was zu einem Namespace-Konflikt führen würde. Beide Verwendungen führen zu genau denselben OS-API-Aufrufen (Sie können dies unter Linux überprüfen, indem Sie es ausführenstrace your_program
).Ich finde es sehr unwahrscheinlich, dass jemand eine solche Funktion benennt, da dies
printf()
eine der am häufigsten verwendeten Funktionen ist. In C ++ werdeniostream
s gegenüber Aufrufen voncstdio
Funktionen wie printf bevorzugt .quelle
printf
Ist in C ++ aufgrund des Mangels an starker Typisierung schmerzlich kaputt, ist es ganz natürlich, es durch eine bessere Version zu ersetzen.std::printf
unterscheidet sich vonmynamespace::printf
und C ++ erlaubt mir explizit, meine eigenen Funktionen zu definieren, deren Namen die von Funktionen im Inneren beschattenstd
. Das ist einfach nicht umstritten. Was Ihre Behauptungenprintf
betrifft, die aufgrund der losen Eingabe effizient sind, ist das natürlich auch falsch.printf
ist nicht einmal besonders effizient, es gibt viel effizientere Implementierungen, die stark typisiert sind.Aus dem C ++ 11-Standard:
Wenn Sie also verwenden
<cstdio>
, können Sie sicher sein, dassprintf
sich das imnamespace std
und damit nicht im globalen Namespace befindet.Die Verwendung eines globalen Namespace führt zu einem Namenskonflikt. Dies ist kein C ++ - Weg.
Daher verwende ich
<cstdio>
Header und rate Ihnen dazu.quelle
<cstdio>
Ihnen garantiert, dass std :: printf vorhanden ist, es gibt jedoch keine Garantie des Standards, wenn :: printf ebenfalls vorhanden ist oder nicht. In der Tat, in jedem Compiler habe ich je von :: printf gehört wird in den globalen Namensraum eingespritzt , wenn Sie umfassen<cstdio>
.Aus meiner eigenen Praxis:
std::
Präfixe verwenden. Andernfallsabs
wird Sie eines Tages sehr schmerzhaft beißen, wenn Sie Gleitkommazahlen verwenden.Nicht qualifiziert
abs
bezieht sich auf Funktionen, dieint
auf einigen Plattformen definiert sind. Bei anderen ist es überlastet. Iststd::abs
jedoch immer für alle Typen überlastet.quelle
Die Verwendung von "
printf
ohne"std::
kann zu Namenskonflikten führen und wird von vielen C ++ - Entwicklern als schlechte Praxis angesehen. Google ist dein Freund in diesem Fall, aber hier sind einige Links, hoffe, das hilftWarum wird "using namespace std" als schlechte Praxis angesehen? http://www.cplusplus.com/forum/beginner/61121/
quelle
using namespace std
ist eine schlechte Praxis, aberprintf
ohnestd::
Qualifikation nicht.using namespace std;
ist hier nicht mein Problem. Ich benutze es nie.printf();
undstd::printf();
arbeite in C ++ ohneusing namespace std;
Deshalb habe ich die Frage gepostet.std::printf
es fühlt sich einfach seltsam an.In stdio
Es sollte also keinen Unterschied machen.
quelle