Dein C ist kein Standard-C

Your C is not standard C

Der Artikel listet Inkompatibilitäten zwischen Standard-C und der realen Implementierung von gcc/clang mit glibc/musl auf. Dazu gehören: asm als nicht reserviertes Schlüsselwort, FLT_ROUNDS wird von gcc immer auf 1 gesetzt, standardisierte Pragmas werden von gcc ignoriert, initstate verletzt POSIX, Clang behandelt const in Rückgabetypen als signifikant, und musl's va_start unterstützt nicht C23. Der Autor zeigt auf, wo Compiler und Libs vom Standard abweichen.

Das Komitee hat eine unwirkliche Sprache geschaffen, die niemand tatsächlich nutzen kann oder wird.
  1. omoikane

    Dass GCC die Standard-Pragmas immer noch nicht implementiert, erinnert mich an das alte GCC-Pragma-Easter-Egg. Das steht in cccp.c von gcc 0.9:

    /*

    * the behavior of the #pragma directive is implementation defined.

    * this implementation defines it as follows.

    */

    do_pragma ()

    {

    close (0);

    if (open ("/dev/tty", O_RDONLY) != 0)

    goto nope;

    close (1);

    if (open ("/dev/tty", O_WRONLY) != 1)

    goto nope;

    execl ("/usr/games/hack", "#pragma", 0);

    execl ("/usr/games/rogue", "#pragma", 0);

    execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0);

    execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0);

    nope:

    fatal ("You are in a maze of twisty compiler features, all different");

    }

    In gcc 1.21 ist es verschwunden:

    #if 0

    /* This was a fun hack, but #pragma seems to start to be useful.

    By failing to recognize it, we pass it through unchanged to cc1. */

    ...

    #endif

  2. MisterTea

    Als jemand, der es liebt und genießt, Plan 9 C zu schreiben, kann ich nur sagen, dass "Standard-C", was auch immer das heutzutage bedeuten mag, ein Chaos ist. Zu viele Dinge, um sie aufzuzählen, angefangen bei den einzigen beiden OSS-Compilern, die aufgeblähte Monster sind, über Post-C99-Ergänzungen, die sinnlos sind, Inline-Assembler, der die Portabilität ruiniert*, bis hin zu POSIX, das in Flammen aufgehen soll (zusammen mit Schreibmaschinen-Terminals.)

    Ich habe einen Freund, der derzeit im C-Komitee ist und wahrscheinlich gehen wird wegen all der schlechten Ideen, die sowohl umgesetzt wurden als auch noch umgesetzt werden sollen.

    * Nein, eine Million hässlicher #ifdefs über die Quelldateien zu verteilen ist widerlich und schwer zu lesen. Teilt den Code auf, verdammt noch mal.

  3. dzaima

    > gcc definiert jedoch immer FLT_ROUNDS als 1

    Nun, wenn man bedenkt, dass gcc das FENV_ACCESS-Pragma nicht unterstützt und somit alle fesetround-Aufrufe immer UB sind, ist es gültig, dass es sich so verhält, als ob sich der Rundungsmodus nie vom Standard ändert :)

  4. fooker

    Der Zweck eines Sprachstandards ist zirkulär: Es geht darum, dass er existiert und frei von Inkonsistenzen ist.

    Ob ein Compiler den Standard implementiert, liegt bei den Compiler-Entwicklern und vielleicht bei seinen Nutzern.

    In einer Ära, in der Code-Portabilität von größter Bedeutung war, ergab das vielleicht viel Sinn.

    Aber jetzt können wir einen Compiler und seine Bibliotheken so ziemlich als den Standard für die Sprache behandeln, so wie es Rust macht.

  5. Syzygies

    ...und ich dachte, Go sei Standard-C!

Mehr von diesem Tag

2026-10-15