我需要链接2个库。第一个库需要一个头文件,其中包含:
typedef int TYPE
第二个库需要一个头文件,其中包含:
typedef struct type TYPE
显然,将它们链接会导致违反单一定义规则(ODR)。这里显而易见的解决方案是重命名其中一种类型。但是,这将要求我在数百个文件中进行更改,这是我试图避免的,因为它会使我们所有的项目都不一致。 还有其他办法可以解决这个问题吗?
答案 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的头文件可能会使用与这些定义相冲突的宏来做奇怪的事情,所以你应该在之前检查它。