8

我得到了 2 个包含的头文件,它们都具有相同名称的 typedef。

假设 aaa.h 和 bbb.h。它们来自 2 个不相关的 3rd 方包,我无法控制这 2 个文件,但必须使用它们。我没有直接包含这两个文件,但它们被子包含在顶级头文件中。(即我包括 ah 和 bh 分别包括它们)

由于名称冲突,当它们都包含在内时,我的程序将无法编译。

所以我的临时解决方案是我将 aaa.h 复制到我的源代码树中,只删除了 typedef,称为 myaaa.h。在文件的顶部,我保持“#ifndef AAA_H,#define AAA_H”包装完整,所以当我包含 myaaa.h 时,不会包含 aaa.h,因为 AAA_H 标志已经定义,间接删除了 typedef 冲突。

有没有更聪明的方法来做到这一点,而无需将此类文件(并且我必须对其进行版本控制)添加到我的源代码中?

谢谢!

4

1 回答 1

13
#define conflicting_typedef aaa_conflicting_typedef
#include "aaa.h"
#undef  conflicting_typedef
#define conflicting_typedef bbb_conflicting_typedef
#include "bbb.h"
#undef  conflicting_typedef
#define conflicting_typedef ambiguous use aaa_conflicting_typedef or bbb_conflicting_typedef

如果需要引用typedeffrom aaa.h,可以使用名称aaa_conflicting_typedef;要引用typedeffrom bbb.h,使用 name bbb_conflicting_typedef。如果(可能是这种情况)您不需要typedef在代码中引用任何一个,那么您就可以开始了。final#define确保您不使用普通名称;您必须使用正确的映射名称。

显然,这不应该重复;如果有多个文件需要此节,请将其放入您自己的标题“aaa_bbb.h”中,并将其包含在您需要该节的地方。您甚至可以检测是否包含aaa.hbbb.h已经包含并拒绝编译(如果包含)(您无法检测它们是否在此之后被包含,但它们曾经在您的控制下被包含的事实意味着它们不应该被包含再次包括在内)。

如果这是 C++,由于类型安全的链接,你会遇到更大的问题。OTOH,图书馆供应商都犯了不当的名称空间控制罪。

于 2012-09-05T23:56:34.690 回答