Tu C no es C estándar: los compiladores ignoran el estándar que dicen seguir

Your C is not standard C

El estándar de C define un lenguaje que gcc, clang y musl no implementan del todo. El artículo repasa incompatibilidades concretas: la palabra clave asm, la macro FLT_ROUNDS, las pragmas STDC que gcc ignora desde C99, el comportamiento de initstate en glibc, los calificadores en tipos de retorno y la definición obsoleta de va_start en musl. Una lista incómoda para quien programa en C.

El comité ha creado un lenguaje irreal que nadie puede ni podrá usar realmente.
  1. omoikane

    Que GCC siga sin implementar los pragmas estándar me recuerda al viejo easter egg del pragma de GCC. Esto está en cccp.c de 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");

    }

    Para gcc 1.21 ya no está:

    #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. dzaima

    > gcc, sin embargo, siempre define FLT_ROUNDS como 1

    Bueno, considerando que gcc no soporta el pragma FENV_ACCESS, y como tal todas las llamadas a fesetround son siempre UB, es válido que actúe como si el modo de redondeo nunca cambiara del predeterminado :)

  3. MisterTea

    Como alguien a quien le encanta y disfruta escribir C de Plan 9, todo lo que puedo decir es que el "C estándar", lo que sea que signifique hoy en día, es un desastre. Hay demasiadas cosas para enumerar, desde que los únicos dos compiladores de código abierto son monstruos inflados, las adiciones posteriores a C99 no tienen sentido, el asm en línea arruina la portabilidad*, y POSIX puede morir en un incendio (junto con las terminales de máquina de escribir).

    Tengo un amigo que actualmente está en el comité de C y probablemente se va a ir por todas las malas ideas que se han implementado y se van a implementar.

    * No, llenar los archivos fuente con un millón de #ifdefs feos es asqueroso y difícil de leer. Dividan el código, por Dios.

  4. Syzygies

    ¡...y yo que pensaba que Go era C estándar!

Más de este día

2026-10-15