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

What is the standard way to fix conflicting types from different libraries in C?

我正在尝试将第 3 方库包含到 .c 文件中,但它给出了 redefinition类型冲突 错误,因为它具有同名的 typedef 结构。

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

例如(还要改变函数return的类型)

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

然而,实际上,结构名称仅在编译时才有意义。如果您正在使用 third-party 库的打包 pre-compiled 版本,那么您可能只需要担心 headers。您可能 能够使用预处理器更改程序翻译单元范围内的一个或两个标记。例如,

#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 作为另一个。请注意,这可能会产生比您想要的更广泛的影响——例如,更改结构成员名称。此外,尽管它有很好的工作机会,但在技术上 non-conforming 调用任何具有参数或 return 派生自或包含原始结构类型实例的类型的函数(有一些警告)。

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

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