【问题标题】:Typedef, Violation of ODR: same keyword alias different typesTypedef,违反 ODR:相同的关键字别名不同的类型
【发布时间】:2014-12-11 14:26:57
【问题描述】:

我需要链接 2 个库。第一个库需要一个头文件,其中:

typedef int TYPE

第二个库需要一个头文件,其中:

typedef struct type TYPE

显然将它们链接会导致违反单一定义规则 (ODR)。这里明显的解决方案是重命名其中一种类型。但是,这也需要我在数百个文件中进行更改,我试图避免这种情况,因为它会使我们所有的项目不一致。 有没有其他方法可以解决这个问题?

【问题讨论】:

  • 更改所有文件会导致项目不一致?
  • @mafso 例如,project1 使用关键字 TYPE,而这个项目将使用 _TYPE,尽管它们都是相同类型的别名
  • 仅当您不更改数百个文件时。我不确定你想要什么。要么在整个项目中一致地调用相同的类型(这意味着在您的情况下进行重构),要么您只希望使用 TYPEs 的文件中的不同标识符(这意味着您可以保持数百个文件不变,但使项目不一致)。

标签: c typedef one-definition-rule


【解决方案1】:

如果库 A 具有头文件 header_a.h 而库 B 具有头文件 header_b.h,您可以在必须同时包含两者的源代码表单中执行类似的解决方法:

#define TYPE TYPE_A
#include <header_a.h>
#undef TYPE

#define TYPE TYPE_B
#include <header_b.h>
#undef TYPE

这会导致声明

typedef int TYPE;          /* from library A */
typedef struct type TYPE;  /* from library B */

显示为

typedef int TYPE_A;
typedef struct type TYPE_B;

这应该可以正常工作,因为目标文件中不存在类型信息。尽管如此,库 A 和 B 中的头文件可能会使用与这些定义不同的宏来做一些奇怪的事情,因此您应该事先检查一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多