Dies ist eine unvollständige Liste von Inkompatibilitäten zwischen dem C, wie es im Standard beschrieben ist, und dem C, wie es in der Praxis für Nutzer von gcc oder clang mit glibc oder musl existiert.
Standardmäßig erkennen gcc und clang das Schlüsselwort asm als Erweiterung. In Standard-C ist asm ein gültiger, nicht reservierter Bezeichner. Daher kann standardkonformer Code mit den Standardeinstellungen möglicherweise nicht kompiliert werden. Compiler sind standardmäßig nicht konform, und der Standard hätte asm wie in C++ zu einem reservierten Wort machen können, hat dies jedoch nicht getan.
Der Standard verlangt, dass FLT_ROUNDS Laufzeitänderungen des Rundungsmodus widerspiegelt, die über fesetround in <fenv.h> vorgenommen werden. gcc definiert FLT_ROUNDS jedoch immer als 1 (zum Nächstgelegenen runden), unabhängig vom Rundungsmodus zur Laufzeit. Clang stellt eine eingebaute Funktion __builtin_flt_rounds() bereit, gcc hingegen nicht.
Der C-Standard legt Gleitkomma-Pragmas fest, die in C99 und C23 hinzugefügt wurden, um das arithmetische Verhalten zu steuern. Mehr als 27 Jahre nach C99 ignoriert gcc sie immer noch alle als No-Ops, und clang unterstützt nur die Pragmas aus C99. Ein Teil der Funktionalität lässt sich mit Kommandozeilen-Flags nachbilden, diese gelten jedoch für die gesamte Übersetzungseinheit und nicht für einzelne Funktionen oder Blöcke.
Der Standard verlangt, dass Qualifizierer in Rückgabetypen von Funktionen verworfen werden. Clang behandelt sie dagegen als bedeutsam. Daher führt die Deklaration von int f(); und const int f(); zusammen zu einem Fehler wegen widersprüchlicher Typen, obwohl beide Deklarationen identisch sein sollten.
Quelle: Hacker News · Zusammengefasst von HeadlinesBriefing