gpt4 book ai didi

c - 在 C 中修复来自不同库的冲突类型的标准方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:14 25 4
gpt4 key购买 nike

我试图将第 3 方库包含到 .c 文件中,但它给出了重新定义冲突类型 错误,因为它有具有相同名称的 typedef 结构。

在阅读了 SO 中的一些答案后,我尝试包含守卫,显然直接更改 .h 文件上的 typedef 已经解决了问题。

例如(还必须更改函数返回类型)

// stack.h
typedef struct item stack_item;

// queue.h
typedef struct item queue_item;

然而,原代码如下:

// stack.h
typedef struct item item;

// queue.h
typedef struct item item;

它抛出以下错误:

In file included from test.c:5:0:
Queues/queue.c:6:8: error: redefinition of ‘struct item’
struct item {
^

In file included from Stacks/stack.c:4:0, from test.c:4:
Stacks/stack.h:6:16: note: originally defined here
typedef struct item item;
^

我想知道解决这个问题的标准方法是什么,而不是更改.h 文件中的定义

最佳答案

C只有一个结构体标签的命名空间,其中还包含 union 体和枚举的标签。您不能在同一范围内使用具有相同标记的两种不同结构类型。有一个不同的命名空间,其中包含 typedefed 标识符等,但同样,一个类型名称在任何给定范围内只能表示一件事。

然而,在实践中,结构名称仅在编译时才有意义。如果您使用的是第三方库的打包预编译版本,那么您可能只需要担心 header 。您可能能够使用预处理器更改程序翻译单元范围内的一个或两个标记。例如,

#define item stack_item
#include <stack.h>
#undef item

#define item queue_item
#include <queue.h>
#undef item

然后您的代码将使用 struct stack_item 和/或 typedef stack_item 作为一个,以及 struct queue_item 和/或 queue_item 为另一个。请注意,这可能会产生比您想要的更广泛的影响——例如,更改结构成员名称。此外,尽管它有很好的工作机会,但调用任何具有派生自或包含原始结构类型实例的参数或返回类型的函数在技术上是不符合要求的(有一些注意事项)。

如果这不起作用,您还可以考虑手动执行等效编辑以生成仅供您的项目使用的 header 的本地版本。这将使您能够更准确地了解更改的内容,但使用这些 header 仍然会遇到上述一致性问题。

如果您必须在同一个翻译单元中使用这两个库,并且您想确保您的代码符合标准,那么您就不走运了。唯一符合的替代方法是修改和重建一个或两个库,以便它们不再有名称冲突。

关于c - 在 C 中修复来自不同库的冲突类型的标准方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53855784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com