Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何解析同名的两个结构?_C_Structure - Fatal编程技术网

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生成的扫描程序,它们在大量符号上发生冲突,所以我使用了类似的技巧,效果非常好。我想你更需要担心的是,有人对结构的重命名感到困惑,因为这些冲突的名称可能来自外部来源。函数调用等的文档将不再与实际原型匹配,因此任何用户都必须清楚发生了什么。更改代码有什么问题?如果可以,我会。:)对不起,尼尔,就我而言,这根本不是一个选择。我正在集成两个不同的模块,它们都是我无法控制的,是它们造成的。