Это неполный список несовместимостей между C, описанным в стандарте, и C, который существует на практике у тех, кто использует gcc или clang с glibc или musl.
По умолчанию gcc и clang распознают ключевое слово asm как расширение. В стандартном C asm является допустимым нерезервированным идентификатором, поэтому код, соответствующий стандарту, может не компилироваться с настройками по умолчанию. Компиляторы по умолчанию не соответствуют стандарту, и стандарт мог бы сделать asm зарезервированным словом, как это сделано в C++, но не сделал.
Стандарт требует, чтобы FLT_ROUNDS отражал изменения режима округления во время выполнения, выполненные через fesetround из <fenv.h>. Однако gcc всегда определяет FLT_ROUNDS как 1 (округление к ближайшему), независимо от режима округления во время выполнения. Clang предоставляет встроенную функцию __builtin_flt_rounds(), а gcc — нет.
Стандарт C задаёт директивы плавающей точки, добавленные в C99 и C23, для управления арифметическим поведением. Спустя более 27 лет после C99 gcc по-прежнему игнорирует их все как пустые операции, а clang поддерживает только директивы C99. Часть функциональности можно воспроизвести флагами командной строки, но они применяются ко всей единице трансляции, а не к отдельным функциям или блокам.
Стандарт требует отбрасывать квалификаторы в возвращаемых типах функций. Clang же считает их значимыми, поэтому объявление int f(); вместе с const int f(); приводит к ошибке конфликтующих типов, хотя эти два объявления должны быть идентичны.
Источник: Hacker News · Сводку подготовил HeadlinesBriefing