我想在swift类中使用objc库和objc类.所以我将以下内容放在Bridging-Header.h中:
#import <FooLibrary/FooLibrary.h>
#import "FooClass.h"
Run Code Online (Sandbox Code Playgroud)
问题是FooClass.h有
#import "FooLibrary.h".
Run Code Online (Sandbox Code Playgroud)
因此,当我编译时,我得到了数百个错误,例如:"枚举器的重新定义"和"属性具有先前定义"和"重复协议定义"和"Typedef重新定义"
我该如何避免这种情况?看起来这只是我所拥有的一个愚蠢的心理障碍,但我无法超越它,所以我在这里问.
PartiallyFinite建议我留意 #include
我做了一个项目范围的搜索,而我根本没有使用它.图书馆里有一些.我选择了其中一个错误.装饰所在的文件永远不会包含在任何文件中#include
Gre*_*reg 10
听起来有些事情导致预处理器认为FooLibrary.h由第二个间接导入的标题在#import某种程度上与您在其上方所包含的文件不同.我最好的猜测,什么是你的第一个,框架式的进口会引用复制到构建过程中生成位置的头文件,而你的第二个,直接导入文件中引用的头文件,因为它是在你的项目目录,这意味着预处理器将它们视为两个完全独立的文件,导致它被导入两次.
建议的修复方法:
如果您可以包含FooClass.h使用框架样式的导入语法(如#import <FooLibrary/FooClass.h>),那么可能会解决问题.
如果您完全确定FooClass.h将始终包含FooLibrary.h,您可以完全省略第一次导入,因为所有内容都将通过第二个间接导入.
否则,您可以尝试一些不错的,老式的包含警卫(假设您具有对库头的写入权限):
// 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
Run Code Online (Sandbox Code Playgroud)
这将在第一次导入文件时定义预处理器宏,因此第二次预处理器尝试导入文件时,已定义的宏将阻止第二次导入内容.我不明白为什么#import在你的情况下没有做到这一点,因为这实际上是它唯一的目的和优势#include,但如果这个解决它,¯\ _(ツ)_ /¯
| 归档时间: |
|
| 查看次数: |
4604 次 |
| 最近记录: |