我已经获得了两个包含两个同名typedef的头文件。
让我们说aaa.h和bbb.h.它们来自2个不相关的第三方软件包,我无法控制这两个文件,但必须使用它们。我没有直接包含这两个文件,但它们相当包含在顶级头文件中。 (即我包括分别包含它们的a.h和b.h)
由于名称冲突,我的程序在包含它们时都不会编译。
所以我的临时解决方案是将aaa.h复制到我的源代码树中,只删除了typedef,名为myaaa.h。在文件的顶部,我保持“#ifndef AAA_H,#define AAA_H”包装器完好无损,所以当我包含myaaa.h时,不会包含aaa.h,因为已经定义了AAA_H标志,间接删除了typedef冲突。 / p>
有没有一种更聪明的方法可以在不添加这样的文件(我必须对其进行版本控制)的情况下执行此操作?
谢谢!
答案 0 :(得分:11)
#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,图书馆供应商都因不正确的名称空间控制而受到谴责。