Это ужасный хак, но можно было бы использовать макрос для переопределения имени структуры, например
// a.h
struct collide {
int a;
};
// b.h
struct collide {
float b;
};
// test.c
#define collide a_collide
#include "a.h"
#undef collide
#include "b.h"
int main(){
struct a_collide a;
struct collide b;
return 0;
}
Возможно, вы захотите переименовать структуру для обоих заголовков, чтобы выдавать ошибки, когда кто-то неизбежно использует неправильную структуру, возможно, в заголовке оболочки, например
// wrap_a.h
#define collide a_collide
#include "a.h"
#undef collide
Не забудьте отменить определение макроса, чтобы избежать случайных замен в коде.