> Вроде пишется по конкретный компилятор? Оно как бы так стало не потому что так всем очень нравится, а потому что в стандарте НЕТ некоторых вещей требующихся для написания ядер, бутлоадеров, фирмварей и прочего. Номинально есть freestanding, но он только о том что кто должен и не должен реализовывать. А про то как разместить вот эту функцию в вон той секции, и как кастомно компоновать адресацию, лэйаут памяти и проч - там ничего нет. И тут оказывается что вот эта хрень - компилер специфична. И вы либо вообще обламываетесь, либо кодите под кого-то конкретного. Используя extended фишки которых в стандартах НЕТ.
Со временем GCC как-то стал более-менее золотым стандартом этсамого. И даже шланг и в меньшей степени другие, типа tcc какого-нибудь, стали обезьянить как некоторые нестандартные вещи делаются. Сейчас ядро линуха и clang'ом вроде собирается, плюс-минус. У оного мощный статический анализатор, лишний раз код прозвонить - идея некоторым нравится.
> А про остальные портируется (с ответственностью на тех, кто портирует).
> Или я чего то не понимаю? Зачем тащить скраб, когда он не нужен?
Можно самому изобретать велик, при том - с ржавой рамой из водопроводных труб и деревянными колесами, потому что под рукой ничего лучше не было, так что слепили подобие велика из того что есть. Ездит же как-то? А можно и более нормальный взять, если уж есть.
> Зачем синтаксический сахар, когда он вносит больше неопределённости?
Никакой неопределенности оно не вносит. А делать велосипед самому из ржавых труб может и задолбать, особенно если можно и получше чем это. Самолично хреначить детект истинных размеров типов и из этого крафтить потребные exact width типы, обвесив столь же самопальными квазиассертами из гамна и палок вида #define assert(cond, why) typedef char why[cond ? 1 : -1] - это имнено оно! И даже еррор при обломе - кривой. А в C11 это все есть сразу и не через зад.