Встречал как-то кулхацкерский вариант с неполным объявлением типа и
жонглированием typedef. Исходная идея была другая - изолированно
компилировать модули. Оно рушилось при включении
полного объявления перед неполным, но это обходилось ручками. В результате применения
вылезли бока - типы (структуры) в разных модулях со временем
разъехались чуток (где-то чего-то добавили, поменяли), а я как раз на это напоролся и пришлось выметать поганой метлой.
Т.е. в одном файле был полный typedef на структуру, в другом был неполный typedef на структуру с таким же именем и ниже полный, но структуры были по факту объявления разными, и пока они не пересекались областями видимости, всё компилилось и собиралось. GCC это дело благополучно прятал (флаг -fno-common не был установлен)...
Ещё есть практика использовать config.h без защиты от двойного включения.
Кроме того, есть прекрасные вещи типа #if !defined(), приобретающие смысл при включении дополнительных хедеров, без которых в принципе всё и так компилится:)
Ещё припоминается директива #undef...
Также можно подумать о "нетрадиционном" использовании атрибута weak
Но понять, что желаете получить в плане юзабилити, у меня пока не получается