C typedef名称冲突

我有两个头文件,我包含两个都具有相同名称的typedef。

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

由于名称冲突,我的程序不会被编译。

所以我的临时解决方案是将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 

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

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

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