2

Apple 在其所有框架类的标头中使用以下代码。

#if !defined(__COREFOUNDATION_CFARRAY__)
#define __COREFOUNDATION_CFARRAY__ 1
...
#endif

在为框架设计类或类别以供框架使用时,这是消除“重复符号”链接器错误的推荐方法,还是这些保留了使用 of#include而不是#import在 c 中的保护?

对此的研究使我找到了这篇关于包含警卫的文章

注意:这个问题不是询问如何修复重复符号错误,而是询问是否有任何方法可以防止您自己的代码在项目中包含多次时导致问题。

4

2 回答 2

3

您对 include 保护的看法是正确的 - 可能有一些兼容性原因,它没有从源代码中删除。

但是,这并不能真正保护您免受重复符号的影响。

例如,

如果您有两个第三方库,每个库都使用 SBJSON 库怎么办(几周前我的同事遇到过这种情况)。

每个库都是单独编译的,所以从他们的角度来看,SBJSON 只包含一次。但是,当我开始链接我的应用程序时,我不能,因为我有重复的符号。

我不得不通过从一个 .a 库文件中手动删除符号来解决这个问题(这个链接表明这是一个很常见的问题!)

编辑:这个链接是一个更清晰的逐步解决问题的方法

于 2012-09-05T09:17:51.933 回答
1

Apple 在其所有框架类的标头中使用以下代码。

不一定适用于 ObjC API。但是CoreFoundation,是的,他们使用包括警卫。在许多阵营中,#include在 C 源代码中使用传统的 s 并#import用于 objc 源代码(#import是编译器扩展,而不是传统的 C)仍然是惯用的。

这是消除“重复符号”链接器错误的推荐方法吗

不,它不能防止链接器错误;它可能会在编译阶段导致重复声明错误。

如果您收到重复的符号链接器错误,则问题出在其他问题上,例如定义的可见性。为此,您应该提供一个麻烦的程序示例。

于 2012-09-05T09:17:42.747 回答