C extensions, portability, and alternative compilers
Beaucoup de code C réel dépend d'extensions non standard et de rustines pour compilateurs et bibliothèques, si bien que le strict respect de la norme ISO C est rare. Les en-têtes système comme ceux de glibc reposent sur des macros prédéfinies par le compilateur et des mécanismes spécifiques à GCC (par exemple __attribute__, #include_next et des headers internes) qui ne fonctionnent pas avec d'autres compilateurs sans compatibilité factice. D'autres bibliothèques et plateformes — SDL, la libc d'OpenBSD, Gnulib et bionic d'Android — intègrent des détections de fonctionnalités, des sémantiques d'inline ou des annotations spécifiques au compilateur qui entraînent des incompatibilités subtiles. Pour un auteur de compilateur C, les solutions pratiques consistent à proposer des correctifs en amont, convaincre les projets de tester le compilateur, appliquer des corrections en aval, ou émuler le comportement de GCC en définissant des macros de compatibilité. L'adoption plus large de macros de test de fonctionnalités atténuerait le problème, mais aujourd'hui le quasi-duopole GCC/clang pousse les nouveaux compilateurs à imiter GCC pour assurer une large compatibilité.