C typedef 名称冲突

问题描述 投票:0回答:1

我已经获得了 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 冲突。

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

c typedef
1个回答
14
投票
#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,库供应商都因名称空间控制不当而犯了罪。

© www.soinside.com 2019 - 2024. All rights reserved.