我需要链接 2 个库。第一个库需要一个头文件,其中:
typedef int TYPE
第二个库需要一个头文件,其中:
typedef struct type TYPE
显然,将它们链接会导致违反单一定义规则 (ODR)。这里明显的解决方案是重命名其中一种类型。但是,这也需要我在数百个文件中进行更改,我试图避免这种情况,因为它会使我们所有的项目不一致。有没有其他方法可以克服这个问题?
我需要链接 2 个库。第一个库需要一个头文件,其中:
typedef int TYPE
第二个库需要一个头文件,其中:
typedef struct type TYPE
显然,将它们链接会导致违反单一定义规则 (ODR)。这里明显的解决方案是重命名其中一种类型。但是,这也需要我在数百个文件中进行更改,我试图避免这种情况,因为它会使我们所有的项目不一致。有没有其他方法可以克服这个问题?
如果库 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 中的头文件可能会使用与这些定义中断的宏做一些奇怪的事情,因此您应该在此之前检查一下。