Ich weiß, dass die meisten Compiler beides zulassen:
#include <stdio.h>
und
#include <cstdio>
Aber jemand hat das behauptet <stdio.h>
ist eigentlich kein C++-Standard. Ist das wahr?
vladutcornel
Ich weiß, dass die meisten Compiler beides zulassen:
#include <stdio.h>
und
#include <cstdio>
Aber jemand hat das behauptet <stdio.h>
ist eigentlich kein C++-Standard. Ist das wahr?
stdio.h
ist Standard, aber veraltet. Immer lieber cstdio
in C++.
[n3290: C.3.1/1]:
Für die Kompatibilität mit der Standard-C-Bibliothek, Die C++-Standardbibliothek stellt die 18 C-Header (D.5) bereit, aber ihre Verwendung ist in C++ veraltet.
[n3290: D.5/3]:
[ Example: The header<cstdlib>
assuredly
provides its declarations and definitions within the namespacestd
. It
may also provide these names within the global namespace. The header
<stdlib.h>
assuredly provides the same declarations and definitions
within the global namespace, much as in the C Standard. It may also
provide these names within the namespacestd
. —end example ]
-1 den Ratschlag „Immer bevorzugen cstdio
in C++” ist nicht gut. cstdio
garantiert keinen sauberen globalen Namensraum, daher besteht der einzige Effekt darin, dass Sie mehr Qualifikationen schreiben oder Anweisungen oder was auch immer verwenden müssen, um portablen Code zu erhalten. Das heißt, es ist mehr Arbeit für negativen Gewinn, was so albern wie möglich ist => der Rat ist nicht gut.
– Prost und hth. – Alf
29. September 11 um 11:26 Uhr
@Alf: Sie würden also veraltete Header empfehlen? Das scheint albern. Und using
/Qualifizierer sind eine gute Sache.
– Leichtigkeitsrennen im Orbit
29. September 11 um 11:29 Uhr
In einem internationalen Standard bedeutet der Begriff “veraltet” “kann in einer späteren Version des Standards entfernt werden”. Die C-Header werden jedoch nicht verschwinden. Sie wurden in C++98 optimistisch abgelehnt, aber AFAIK hat keine Implementierung jemals die von C++98 geforderte saubere Trennung vorgenommen, was sicherlich der Grund ist, warum C++11 jetzt zulässt, dass die Header Namespaces verschmutzen.
– Prost und hth. – Alf
29. September 11 um 12:01 Uhr
Ihre technische und historische Analyse ist korrekt. Aber die Header sind immer noch veraltet und ich sehe keinen Grund, sie zu bevorzugen. Wenn ich C-Header in der C++-Codeüberprüfung sehe, wird der Code nicht bestanden. Ende des.
– Leichtigkeitsrennen im Orbit
29. September 11 um 13:15 Uhr
Solange C- und C++-Compiler zusammenleben (die meisten Compiler haben den C- und C++-Modus) und dasselbe System-Include-Verzeichnis verwenden, sind die C-Header vorhanden, auch wenn sie aus dem Standard entfernt werden.
– Kalmarius
26. August 2012 um 12:39 Uhr
Das stimmt nicht, denn das Hauptziel von C++ ist die Abwärtskompatibilität mit C. Der einzige Unterschied besteht darin, dass for
#include <cstdio>
alle funktionen sind drin std
Namensraum
Etwas vereinfacht betrachtet. stdio.h
kann Sachen reinlegen std
und die Verwendung ist sowieso veraltet.
– Leichtigkeitsrennen im Orbit
29. September 11 um 11:11 Uhr
solange C++ mit C kompatibel ist, wird es legal sein 😀
– GreenScape
29. September 11 um 11:14 Uhr
Aber verworfen. Und C++ ist natürlich nicht 100% kompatibel mit C.
– Leichtigkeitsrennen im Orbit
29. September 11 um 11:16 Uhr
Die C-Standardheader sind aus Kompatibilitätsgründen in der C++-Standardbibliothek enthalten.
Der Unterschied besteht darin, dass Bezeichner in entsprechenden C++-Headern (auch) im std-Namespace sein müssen, während Bezeichner in C-Headern (auch) im globalen Namespace verfügbar sein müssen.
zusätzlich <c...>
Header fügen Überladungen für Funktionen wie hinzu abs
, pow
etc.
Außerdem ersetzen C++-Header einige C-Klassifizierungs-/Vergleichsmakros durch überladene Funktionen.
Sie sind sich dessen vielleicht nicht bewusst, aber sie sind es. Und ich habe diese Passage aus dem Standard vor einer Viertelstunde zitiert.
– Leichtigkeitsrennen im Orbit
29. September 11 um 11:29 Uhr
-1 “Zusätzlich” ist falsch: C++11 §D.5/2 “Jeder C-Header, der jeweils einen Namen der Form hat name.h
verhält sich so, als ob jeder Name durch den entsprechenden in den Namensraum der Standardbibliothek gestellt würde cname Header wird innerhalb des Geltungsbereichs des globalen Namespace platziert.”
– Prost und hth. – Alf
29. September 11 um 11:51 Uhr
@Cheersandhth.-Alf: Besucher hatte Recht. Überladungen für verschiedene Eingabetypen für abs
und ähnliche Funktionen sind in definiert <cmath>
aber nicht drin <math.h>
(was nicht beinhaltet abs
überhaupt; Es ist in <stdlib.h>
und nimmt nur int.)
– Nick Matteo
19. April 16 um 1:31 Uhr
@Kundor: Was ist das allererste Wort, das Sie in C++11 §D.5/2 nicht verstehen? wird der Namespace der Standardbibliothek durch den entsprechenden cname-Header in den Geltungsbereich des globalen Namespace gestellt.”?
– Prost und hth. – Alf
19. April 16 um 1:50 Uhr
@Cheersandhth.-Alf: Nun, mein Compiler versteht es auch nicht, denn was der Besucher und ich gesagt haben, ist das, was passiert. Versuch es.
– Nick Matteo
19. April 16 um 1:51 Uhr
Die C++-Standardbibliothek enthält explizit die C-Standardbibliothek, ist also ein völlig legitimer Bestandteil von C++. Und wenn Sie über die Verwendung sprechen #include <stdio.h>
in C++-Code, dann sollten Sie das nicht tun, denn das ist C-Syntax, in C++-Code sollten Sie immer cstdio verwenden
.