如何避免桥接头中的“重新定义”和“重复协议”定义错误

卢卡斯·古森(Lucas Goossen)

我想在Swift类中使用objc库和objc类。因此,我将以下内容放入Bridging-Header.h中:

#import <FooLibrary/FooLibrary.h>
#import "FooClass.h"

问题在于FooClass.h具有

#import "FooLibrary.h".

因此,当我进行编译时,会遇到数百种错误,例如:“枚举器的重新定义”和“属性具有先前的定义”,“重复的协议定义”和“ Typedef重新定义”

如何避免这种情况?看来这只是我的愚蠢心理障碍,但我无法摆脱,所以在这里我要问。

部分有限建议我注意 #include

我进行了整个项目的搜索,但我根本没有使用它。图书馆里有几本。我选择了其中一个错误。装饰所在的文件永远不会包含在带有#include

格雷格

听起来好像是某种原因导致预处理器相信FooLibrary.h第二个间接导入标头#import与您在其上方包含标头某种程度上是不同的文件。我最好的猜测,什么是你的第一个,框架式的进口会引用复制到构建过程中生成位置的头文件,而你的第二个,直接导入文件中引用的头文件,因为它是在你的项目目录,这意味着预处理器将它们视为两个完全独立的文件,从而导致两次导入。

建议的修复方法:

  1. 如果您可以包括FooClass.h使用框架样式的导入语法(如#import <FooLibrary/FooClass.h>),则可能会解决此问题。

  2. 如果您完全确定FooClass.h始终包含FooLibrary.h,则可以完全省略第一个导入,因为所有内容都将通过第二个间接导入。

  3. 否则,您可以尝试一些不错的老式包含保护(假设您具有对库头的写访问权):

    // FooLibrary.h
    
    #pragma once // Maybe even throw in one of these for good measure;
                 // since we're dealing with an obscure-sounding bug,
                 // may as well try to fix it in all of the possible ways
    
    #ifndef FOOLIBRARY_IMPORTED
    #define FOOLIBRARY_IMPORTED
    ... // actual file contents
    #endif
    

    这将在第一次导入文件时定义一个预处理器宏,因此,在第二次预处理器尝试导入文件时,已经定义的宏将阻止第二次导入内容。我不明白为什么#import在您的情况下不这样做,因为这实际上是它的唯一目的和优势#include,但是如果解决了这个问题,则\\((ツ)_ /

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档