Typedef,违反ODR:相同的关键字别名不同的类型

时间:2014-12-11 14:26:58

标签: c typedef one-definition-rule

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

typedef int TYPE

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

typedef struct type TYPE

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

1 个答案:

答案 0 :(得分:4)

如果库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的头文件可能会使用与这些定义相冲突的宏来做奇怪的事情,所以你应该在之前检查它。