В моей базе кода я обнаружил, что два модуля имеют структуры с тем же именем. Он дает ошибку конфликта имен. Есть ли способ решить проблему без изменения кода?Как разрешить две структуры с тем же именем?
ответ
Это ужасный хак, но можно было бы использовать макрос, чтобы переопределить имя структуры, например, так
// 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 макроса, так что вы не получаете случайные замены на протяжении всего кода.
Я бы не сказал, что это так ужасно. Как только мне пришлось включить в программу две скрипты, созданные с помощью lex, и они столкнулись с большим количеством символов, поэтому я использовал подобный трюк, и он работал как шарм. – qrdl
Я думаю, что вам больше нужно беспокоиться о том, что кто-то путает переименование структур, так как предположительно эти конфликтующие имена поступают из внешнего источника. Документация на вызовы функций и т. Д. Больше не будет соответствовать фактическим прототипам, поэтому пользователям необходимо будет четко понять, что произошло. –
На самом деле не очень хорошие идеи. Вот два не очень хорошие:
Если очень повезет, вы можете отделить ваш код так, что ни один модуль каждый должен получить доступ обоих типов структуры в одно время, то только не включают правильный заголовок, и вы уходите. Это чревато опасностью, и будет быть кошмаром в ремонте: каждый, кто приходит после вас, будет иметь право проклинать ваше имя и всех ваших потомков седьмому поколению.
Если код c89ish, вы можете попробовать выполнить компиляцию с помощью компилятора C++ и обернуть одну или несколько структур-нарушителей в пространстве имен. Это вводит проблемы из всех придирчивых небольших различий в двух языках (правила кастинга,
class
как зарезервированное слово и т. Д.), Поэтому он почти наверняка нарушает ваш запрос, чтобы не изменять код.
Удачи.
- 1. Вставить две структуры с тем же именем в структуре
- 2. Две разные команды с тем же именем
- 3. Вызывать две функции с тем же именем
- 4. Python: две функции с тем же именем
- 5. Как разрешить загрузку файла с тем же именем jquery.filer
- 6. Как разрешить выполнение нескольких заданий Хадсона с тем же именем
- 7. Как интегрировать две [HttpPost] с тем же именем actionresult? (MVC)
- 8. Как использовать две переменные с тем же именем
- 9. Две базы данных с тем же именем, как сбросить
- 10. разрешить только одно соединение с тем же именем с FOSUserBundle
- 11. Разные единицы перевода позволяют определять структуры с тем же именем?
- 12. как идентифицировать объект с тем же именем с именем property
- 13. Вложенные структуры с тем же именем в C
- 14. Почему две таблицы не имеют индекс с тем же именем?
- 15. Добавьте две записи xml с тем же именем - InstallShield
- 16. Две кнопки радио с тем же именем, не получают сгруппированных
- 17. Lua - Две локальные переменные с тем же именем
- 18. Python - Веди - Две различные шаги с тем же именем
- 19. R: две функций с тем же именем и :: не работать
- 20. Классы с тем же именем
- 21. Две фасоли (одна из насмехается) с тем же именем и тем же классом в AppContext
- 22. доступа внешняя структура с тем же именем
- 23. Задачи с сельдереем с тем же именем
- 24. Две рамки с тем же символом
- 25. Как запустить функции с тем же именем?
- 26. Как вернуть значение с тем же именем
- 27. Как отслеживать объекты с тем же именем
- 28. Перенаправление «.htaccess» с тем же именем папки
- 29. Что делают функции с тем же именем?
- 30. Область переменной с тем же именем переменной?
Что не так с изменением кода? – 2010-04-21 15:53:09
Если бы я мог, я бы это сделал. :) Извини, Нейл, В моем случае это даже не вариант. Я интегрирую два разных модуля, оба из моего контроля, и они его вызывают. – Jay