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.h
或bbb.h
,如果有,则拒绝编译(在此之后您无法检测到它们是否包含在内,但事实上它们已被包含在您的下面)控制意味着它们不应再被包括在内)。
如果这是C ++,由于类型安全链接,你会遇到更大的问题。 OTOH,图书馆供应商都因不正确的名称空间控制而犯了罪。