stdio.h nicht Standard in C++?

Lesezeit: 4 Minuten

stdioh nicht Standard in C
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 namespace std. 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 namespace std.
—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 stdund 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.hverhä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

.

713570cookie-checkstdio.h nicht Standard in C++?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy