Как разрешить две структуры с одинаковым именем? - PullRequest
6 голосов
/ 21 апреля 2010

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

Ответы [ 2 ]

9 голосов
/ 21 апреля 2010

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

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

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

2 голосов
/ 21 апреля 2010

Не очень хорошие идеи приходят на ум. Вот два не очень хороших:

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

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

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...