2010-04-21 2 views
6

В моей базе кода я обнаружил, что два модуля имеют структуры с тем же именем. Он дает ошибку конфликта имен. Есть ли способ решить проблему без изменения кода?Как разрешить две структуры с тем же именем?

+0

Что не так с изменением кода? – 2010-04-21 15:53:09

+0

Если бы я мог, я бы это сделал. :) Извини, Нейл, В моем случае это даже не вариант. Я интегрирую два разных модуля, оба из моего контроля, и они его вызывают. – Jay

ответ

9

Это ужасный хак, но можно было бы использовать макрос, чтобы переопределить имя структуры, например, так

// 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 

Помните UNDEF макроса, так что вы не получаете случайные замены на протяжении всего кода.

+0

Я бы не сказал, что это так ужасно. Как только мне пришлось включить в программу две скрипты, созданные с помощью lex, и они столкнулись с большим количеством символов, поэтому я использовал подобный трюк, и он работал как шарм. – qrdl

+0

Я думаю, что вам больше нужно беспокоиться о том, что кто-то путает переименование структур, так как предположительно эти конфликтующие имена поступают из внешнего источника. Документация на вызовы функций и т. Д. Больше не будет соответствовать фактическим прототипам, поэтому пользователям необходимо будет четко понять, что произошло. –

1

На самом деле не очень хорошие идеи. Вот два не очень хорошие:

  • Если очень повезет, вы можете отделить ваш код так, что ни один модуль каждый должен получить доступ обоих типов структуры в одно время, то только не включают правильный заголовок, и вы уходите. Это чревато опасностью, и будет быть кошмаром в ремонте: каждый, кто приходит после вас, будет иметь право проклинать ваше имя и всех ваших потомков седьмому поколению.

  • Если код c89ish, вы можете попробовать выполнить компиляцию с помощью компилятора C++ и обернуть одну или несколько структур-нарушителей в пространстве имен. Это вводит проблемы из всех придирчивых небольших различий в двух языках (правила кастинга, class как зарезервированное слово и т. Д.), Поэтому он почти наверняка нарушает ваш запрос, чтобы не изменять код.

Удачи.

Смежные вопросы