В моей кодовой базе я нахожу, что два модуля имеют структуры с тем же именем. Это дает ошибку конфликта имен. Существует ли способ разрешить его, не изменяя код?
Это ужасный взлом, но можно было бы использовать макрос для переопределения имени структуры, например так
// 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
. Не забудьте отменить определение макроса, чтобы не получать случайные замены во всем коде.
На ум не приходят действительно хорошие идеи. Вот два не очень хороших:
Если вам очень повезет, вы можете отделить свой код, чтобы ни один модуль не нуждался в одновременном доступе к обоим типам структур, а затем включите только правильный заголовок, и вперед. Это чревато опасностью и будет кошмаром ремонтопригодности: у любого, кто придет после вас, будет причина проклясть ваше имя и всех ваших потомков до седьмого поколения.
Если код похож на c89ish, вы можете попробовать скомпилировать его с помощью компилятора C ++ и поместить одну или несколько проблемных структур в пространство имен. Это создает проблемы из-за всех мелких различий в двух языках (правила приведения типов, class
как зарезервированное слово и т. Д.), Так что это почти наверняка нарушает ваш запрос не изменять код.
Удачи.