在 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只有一个结构体标签的命名空间,其中还包含联合体和枚举的标签。您不能在同一范围内使用具有相同标记的两种不同结构类型。有一个不同的命名空间,其中包含 typedef
ed 标识符等,但同样,一个类型名称在任何给定范围内只能表示一件事。
然而,实际上,结构名称仅在编译时才有意义。如果您正在使用 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 仍然会遇到上述一致性问题。
如果您必须在同一个翻译单元中使用这两个库,并且您希望确保您的代码符合标准,那么您就不走运了。唯一符合 的替代方法是修改和重建一个或两个库,以便它们不再有名称冲突。
我正在尝试将第 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只有一个结构体标签的命名空间,其中还包含联合体和枚举的标签。您不能在同一范围内使用具有相同标记的两种不同结构类型。有一个不同的命名空间,其中包含 typedef
ed 标识符等,但同样,一个类型名称在任何给定范围内只能表示一件事。
然而,实际上,结构名称仅在编译时才有意义。如果您正在使用 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 仍然会遇到上述一致性问题。
如果您必须在同一个翻译单元中使用这两个库,并且您希望确保您的代码符合标准,那么您就不走运了。唯一符合 的替代方法是修改和重建一个或两个库,以便它们不再有名称冲突。