如何解析两个同名的结构?

时间:2010-04-21 05:18:42

标签: c structure

在我的代码库中,我发现两个模块具有相同名称的结构。它给出了名称冲突错误。有没有办法在不改变代码的情况下解决它?

2 个答案:

答案 0 :(得分: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

请记住取消宏,以免在整个代码中获得随机替换。

答案 1 :(得分:2)

没有真正好的想法浮现在脑海中。这里有两个不那么好的:

  • 如果你很幸运,你可以隔离你的代码,这样就不会有任何模块同时访问这两种类型的结构,然后只包含正确的标题,然后离开你走。这充满了危险,成为可维护性的噩梦:任何追随你的人都有理由诅咒你的名字和你所有的后代直到第七代。

  • 如果代码是c89ish,您可以尝试使用c ++编译器进行编译,并在命名空间中包装一个或多个违规结构。这引入了两种语言中所有挑剔性差异的问题(转换规则,class作为保留字等等),因此它几乎肯定违反了您不更改代码的请求。

祝你好运。