Как разрешить две структуры с тем же именем?

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

6
задан Jay 21 April 2010 в 05:18
поделиться

2 ответа

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

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

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

9
ответ дан 9 December 2019 в 22:31
поделиться

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

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

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

Удачи.

2
ответ дан 9 December 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: