Apple在其所有框架类的标头中使用以下代码。
#if !defined(__COREFOUNDATION_CFARRAY__)
#define __COREFOUNDATION_CFARRAY__ 1
...
#endif
在设计用于框架的类或类别时,这是一种消除“重复符号”链接器错误的推荐方法,还是在c中使用#include
代替#import
的保护措施?
对此的研究引导我阅读include guard
上的这篇文章注意:这个问题不是询问如何修复重复的符号错误,而是询问是否有任何方法可以防止您自己的代码在项目中包含多次而导致问题。
答案 0 :(得分:3)
你对包含守卫是正确的 - 可能有一些兼容性原因它没有从源头上删除。
但是,这并不能真正保护您免受重复符号的影响。
例如,
如果您有两个第三方库,每个库都使用SBJSON库(我几周前就发生在同事身上),那该怎么办呢。
每个库都是单独编译的,所以从他们的角度来看,SBJSON只包含一次。但是,当我来链接我的应用程序时,我不能,因为我有重复的符号。
我必须通过手动删除其中一个.a库文件中的符号来解决这个问题(This link显示这是一个非常常见的问题!)
编辑:This link是一个更清晰的逐步解决问题的方法
答案 1 :(得分:1)
Apple在其所有框架类的标头中使用以下代码。
不一定是ObjC API。但CoreFoundation,是的,他们使用包括警卫。在许多阵营中,使用C源代码中的传统#include
以及将#import
用于objc源代码仍然是惯用的(#import
是编译器扩展,而不是传统的C)。
这是否是消除“重复符号”链接器错误的推荐方法
不,它不会阻止链接器错误;它可能在编译阶段导致重复的声明错误。
如果您遇到重复的符号链接器错误,则问题是其他问题,例如定义的可见性。为此,你应该提供一个麻烦程序的例子。