Или может вообще не смысла переписавать перезагрузки, а просто юзать объекры структуры data? Просто я никак не могу понять зачем нужна эта перезагрузка.
Перегрузки ведь чисто для удобства используются. Всё равно ты в C не можешь рассчитывать на подобную С++ простоту инкапсуляции данных. Поэтому проще всего писать в процедурном стиле, без всех этих акробатик вроде возврата указателя на функцию.
Если нужен полиморфизм, то лучше реализовывать указатели на функции как поля самой структуры, инициализировать их в зависимости от потребностей и далее вызывать функции для конкретного объекта-структуры по этим указателям.
Если полиморфизм даром не сдался, то хватит и обычных функций. Максимум, можно сделать функции с возвратом указателя на данные в качестве результата. То есть
C* setCId(C* data, ID id)
{
//...
return data;
}
C* setCDir(C* data, DIR dir)
{
//...
return data;
}
void main()
{
C test;
ID id;
DIR dir;
//...
setCDir( setCId( &C, id ), dir );
// or
setCId( setCDir( &C, dir ), id );
}
Так довольно часто делают, насколько мне это доводилось видеть. Имхо, не худший вариант.