Ответ 1
C не поддерживает на уровне языка не что иное, как процедурное программирование - и это точный выбор, потому что он родился в основном как "переносная сборка", и он работал как можно плотно рядом с машиной (без прибегая к сборке). Большинство языков ассемблера не обеспечивают гораздо больше, с точки зрения парадигмы программирования, чем оператор вызова стека и функции (некоторые из них даже не такие) - и то, на что моделируется C.
В конце концов, есть причина, по которой родились С++ и Objective C: C должен сохранять свою философию дизайна и добавлять больше абстрактных материалов, которые люди должны были бы развить язык.
Если говорить, то ничего не мешает вам писать, например. OO-код на C - на самом деле, многие люди делают это (я бы сказал, что это одна из самых распространенных идиом на C), но вам не нужно ожидать почти любого синтаксического сахара для этого: вам нужно будет использовать struct
для данных, "нормальные" функции для "эмулировать" методы, состав для наследования, таблицы указателей для полиморфизма и т.д. Тем не менее, я не знаю, считается ли это как идиома "последнего десятилетия", она используется с гораздо дольше.