El artículo de lemon.rip explora un problema fundamental en el desarrollo de software en C: la dificultad de crear código que sea verdaderamente compatible con el estándar ISO C y que funcione de manera consistente en diferentes compiladores y sistemas operativos. La realidad es que la mayoría del código C en producción se apoya en comportamientos no estándar y extensiones específicas de compiladores para funcionar correctamente, a menudo no para añadir funcionalidades, sino para solucionar errores y diferencias entre implementaciones.
El problema se agrava con las bibliotecas estándar del sistema, como stdio.h y limits.h. Por ejemplo, glibc (la biblioteca C estándar en GNU/Linux) utiliza una serie de comprobaciones preprocesador complejas en sys/cdefs.h para detectar las capacidades del compilador y adaptar su comportamiento. Esto puede llevar a situaciones inesperadas, como la necesidad de incluir __attribute__((packed)) para estructuras como epoll_event en Linux, o la gestión de definiciones de constantes en limits.h que dependen de si se está utilizando GCC o no. Incluso los encabezados que deberían ser proporcionados por el compilador, como stddef.h, stdint.h y float.h, requieren archivos limits.h específicos de la plataforma para definir constantes POSIX.
El artículo ilustra cómo proyectos como SDL (para el desarrollo de juegos) y OpenBSD también recurren a trucos similares para la detección de características y la optimización del código, a veces con resultados poco intuitivos y dependientes de compiladores específicos. Se menciona el uso de __only_inline en OpenBSD, que introduce aún más complejidad debido a las diferencias en la semántica de inline entre C y C++ y las incompatibilidades entre versiones de GCC. Finalmente, se destaca el trabajo de Gnulib para abordar estos problemas de compatibilidad con extern inline, revelando la magnitud de las implementaciones incorrectas y extrañas que existen en el mundo del C.
En resumen, el artículo advierte que la portabilidad del código C es mucho más difícil de lo que parece, y que a menudo es necesario comprometer la adherencia al estándar ISO C para lograr un funcionamiento correcto en diferentes entornos. Los desarrolladores deben ser conscientes de estas limitaciones y estar preparados para lidiar con comportamientos inesperados y dependencias específicas del compilador.
