我已经获得了 2 个包含的头文件,并且都有一个同名的 typedef。
假设aaa.h 和bbb.h。它们来自 2 个不相关的第三方软件包,我无法控制这 2 个文件,但我必须使用它们。我不直接包含这两个文件,但它们相当子包含在顶级头文件中(即我包含 a.h 和 b.h,它们分别包含它们)。
由于名称冲突,当它们都包含时,我的程序将无法编译。
所以我的临时解决方案是将 aaa.h 复制到我的源代码树中,仅删除 typedef,称为 myaaa.h。在文件顶部,我保持“#ifndef AAA_H,#define AAA_H”包装完好无损,因此当我包含 myaaa.h 时,不会包含 aaa.h,因为 AAA_H 标志已经定义,间接消除了 typedef 冲突。
有没有更聪明的方法来做到这一点,而不需要将这样的文件(并且我必须对其进行版本控制)添加到我的源中?
#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
如果需要从
typedef
引用aaa.h
,可以使用名称aaa_conflicting_typedef
;要从 typedef
引用 bbb.h
,请使用名称 bbb_conflicting_typedef
。 如果(可能是这种情况)您不需要在代码中引用 typedef
,那么您就可以开始了。 最后的 #define
确保您不使用普通名称;您必须使用正确的映射名称。
显然,这不应该重复;如果有多个文件需要这一节,您可以将其放入您自己的标头“aaa_bbb.h”中,并将其包含在您需要该节的位置。 您甚至可以检测
aaa.h
或 bbb.h
是否已被包含,并拒绝编译(如果已包含)(您无法检测它们是否在此之后包含,但事实上它们已包含在您的控制意味着它们不应再次包含在内)。
如果这是 C++,那么由于类型安全链接,您会遇到更大的问题。 OTOH,库供应商都因名称空间控制不当而犯了罪。