C 如何解析同名的两个结构?
在我的代码库中,我发现两个模块具有相同名称的结构。这是一个名称冲突错误。有没有办法在不改变代码的情况下解决这个问题?没有真正好的想法出现在脑海中。这里有两个不太好的:C 如何解析同名的两个结构?,c,structure,C,Structure,在我的代码库中,我发现两个模块具有相同名称的结构。这是一个名称冲突错误。有没有办法在不改变代码的情况下解决这个问题?没有真正好的想法出现在脑海中。这里有两个不太好的: 如果您非常幸运,您可以将代码分离,这样每个模块都不需要同时访问这两种类型的结构,然后只包含适当的头,然后就可以离开了。这是充满危险的,将是一场噩梦:任何在你之后的人都有理由诅咒你的名字和你所有的子孙,直到第七代 如果代码是C89ISH,可以尝试用C++编译器编译并在命名空间中包装一个或多个违规结构。这就带来了两种语言中所有挑剔的
- 如果您非常幸运,您可以将代码分离,这样每个模块都不需要同时访问这两种类型的结构,然后只包含适当的头,然后就可以离开了。这是充满危险的,将是一场噩梦:任何在你之后的人都有理由诅咒你的名字和你所有的子孙,直到第七代 如果代码是C89ISH,可以尝试用C++编译器编译并在命名空间中包装一个或多个违规结构。这就带来了两种语言中所有挑剔的细微差异(铸造规则,
class
作为保留字等)带来的问题,因此几乎肯定会违反您不更改代码的请求
祝你好运。这是一个可怕的黑客攻击,但是可以使用宏来重新定义结构的名称,如下所示
// 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
记得取消宏定义,这样你就不会在整个代码中得到随机替换。我不会说这是一个非常糟糕的黑客行为。有一次我不得不在我的程序中包含两个lex生成的扫描程序,它们在大量符号上发生冲突,所以我使用了类似的技巧,效果非常好。我想你更需要担心的是,有人对结构的重命名感到困惑,因为这些冲突的名称可能来自外部来源。函数调用等的文档将不再与实际原型匹配,因此任何用户都必须清楚发生了什么。更改代码有什么问题?如果可以,我会。:)对不起,尼尔,就我而言,这根本不是一个选择。我正在集成两个不同的模块,它们都是我无法控制的,是它们造成的。