Was C99 Funktionen schädlich oder nicht unterstützt werden als [geschlossen]
-
19-09-2019 - |
Frage
ich in der Regel schreiben C-Code in C89, jetzt einige Funktionen von C99 (wie intxx_t
oder __VA_ARGS__
oder snprintf
) sind sehr nützlich und kann sogar lebenswichtig sein.
Bevor ich mehr meine Anforderungen von C89 bis C99 Ich wollte etwas von C99 Funktionen kennen wurden weithin unterstützt und welche waren nicht weit unterstützt oder sogar schädlich betrachtet.
Ich weiß, wir können nur unser Ziel Compiler-Unterstützung überprüfen, aber dies würde unsere Unterstützung viel verengen, und da dies für Open-Source-Software ist, würde ich es vorziehen, eine breitere Unterstützung haben.
Zum Beispiel verwenden wir Solaris (suncc) Compiler und gcc, aber es könnten auch andere Compiler sein, die wir von der Art und Weise bewegen würden, während wir die Kompatibilität mit sehr wenig Anstrengungen halten konnten.
Zum Beispiel habe ich nie auf Windows gearbeitet, noch ich weiß nichts über Windows-Compiler, aber es wäre gut, Windows-Kompatibilität zu halten.
Lösung
Eine Reihe von C99 Funktionen sind optional, so dass ihr Mangel nicht technisch nichtkonformen ist. Ich werde nicht unten unterscheiden.
-
Hmm, Sieg nicht
<stdint.h>
haben, obwohl es eine offene -source Version von stdint.h für Microsoft . Selbst wenn die Datei implementiert ist, sind viele der einzelnen Typen fehlen. -
Komplexe und imaginäre Unterstützung oft fehlt oder gebrochen.
-
Erweiterte Identifikatoren und breite Zeichen können Problempunkte sein.
Andere Tipps
goto
ist noch schädlich betrachtet.
Irgendwie habe ich gesammelt vier nach unten Stimmen. Ich stellte die Aussage über levity hinzuzufügen, und ist nur 30% ernst über das Konzept dahinter.
erwarte ich, dass die nach unten Stimmen von Jugendlichen sind, die die Geschichte nicht verstehen, Sprachen zu programmieren. Nicht jeder einzelne goto
ist böse, aber-im Vergleich zu 100% unverfälscht Spaghetti-Code I auf (Millionen von Zeilen von Fortran 66) gearbeitet haben, -es ist sinnvoll und produktiv wie viele goto
Aussagen mit strukturierten Aussagen zu ersetzen (for
, while
, do .. while
, switch
) wie möglich. Aber manchmal ein goto
ist nur gut, wenn es vermeidet die Komplexität, wie zusätzliche Flag-Variablen von mehreren verschachtelten Schleifen auszubrechen.
Nun, gcc ist im Grunde geht gcc sein, unabhängig davon, welche Desktop-O Sie Targeting.
Visual C ++, ist in erster Linie eine C ++ Compiler, ist nicht ganz so mit dem C99 spec betroffen. stdint.h ist Ihre Lieblings intxx_t Makros deklarieren. __VA_ARGS__
ist vorhanden. _Bool, _Complex und _Pragma nicht auf der Microsoft Visual C ++ Compiler implementiert. Ich bin mir ziemlich sicher% ein Feld in printf / scanf nicht umgesetzt wurde, wenn auch vielleicht VC2010 Griffe sie. snprintf vorhanden ist, hat aber einen führenden Unterstrich und etwas andere Semantik.
Kurze Antwort: Die „einfacher“ eine C99-Funktion ist ohne Änderung Compiler Grammatiken oder replumbing die Standard-Bibliothek zu implementieren, desto wahrscheinlicher VC ++ ist es zu unterstützen. Wenn es ein Konflikt zwischen C99 und C ++, C ++ erwarten, um zu gewinnen.
Runtime sizeof ist ein Alptraum der Compiler Schriftsteller. So halte ich für schädlich ist.
glibc implementieren keine C99-konforme realloc
, so realloc(ptr, 0)
nicht tragbar ist.
wurde restrict
ein Stichwort in C99. Das ist Implementierung eingreifend auf den Benutzernamespace. Wenn Sie ein gültiges C89-Programm, das das Wort restrict
enthält, müssen Sie das Programm ändern, um es mit C99 zu arbeiten. Mit anderen Worten: keine Abwärtskompatibilität. Wenn sie die Abwärtskompatibilität brechen würden, sollten sie entfernt gets
von der ersten Standard haben.
Die Art generische Funktionen Mathematik von <tgmath.h>
sind nicht notwendigerweise weitgehend umgesetzt, obwohl sie scheinen mit GCC 4.2.1 auf MacOS X 10.6.2 zur Verfügung gestellt werden.