HeadlinesBriefing HeadlinesBriefing.com

Tu C no es C estándar

Hacker News •
×

Esta es una lista incompleta de incompatibilidades entre el C descrito en el estándar y el C que existe en la práctica para quienes usan gcc o clang con glibc o musl.

De forma predeterminada, gcc y clang reconocen la palabra clave asm como una extensión. En C estándar, asm es un identificador válido no reservado, por lo que el código conforme con el estándar puede no compilarse con la configuración predeterminada. Los compiladores no son conformes por defecto, y el estándar podría convertir asm en una palabra reservada como hace C++, aunque no lo ha hecho.

El estándar exige que FLT_ROUNDS refleje los cambios en tiempo de ejecución del modo de redondeo realizados mediante fesetround en <fenv.h>. Sin embargo, gcc siempre define FLT_ROUNDS como 1 (redondeo al más cercano), independientemente del modo de redondeo en tiempo de ejecución. Clang ofrece una función integrada, __builtin_flt_rounds(), pero gcc no.

El estándar C especifica pragmas de punto flotante, añadidos en C99 y C23, para controlar el comportamiento aritmético. Más de 27 años después de C99, gcc sigue ignorando todos ellos como operaciones nulas, y clang solo admite los pragmas de C99. Parte de esta funcionalidad puede replicarse con opciones de línea de comandos, pero estas se aplican a toda la unidad de traducción y no a funciones o bloques individuales.

El estándar exige que los calificadores de los tipos de retorno de función se descarten. Clang, sin embargo, los considera significativos, de modo que declarar int f(); y const int f(); juntos produce un error de tipos conflictivos, aunque ambas declaraciones deberían ser idénticas.

Fuente: Hacker News · Resumido por HeadlinesBriefing