2013-07-16 45 views
14

我猜如果是C++代码在我的项目一个机会,可以使用可变我只会用UIKIT_EXTERN。何时使用UIKIT_EXTERN VS刚刚的extern

如果是这样的话就不会只是安全声明所有与UIKIT_EXTERN外部可用常数?

为什么我没有看到这个吗?

+0

另一个选择是'FOUNDATION_EXPORT'根据http://stackoverflow.com/questions/10953221/foundation-export-vs-extern –

回答

22

我猜我只会使用UIKIT_EXTERN,如果有可能在我的项目中使用该变量的C++代码。

没错。这是主要原因。发生这种情况是因为C和C++符号使用不同的命名约定。

有一个不太常见的原因:UIKIT_EXTERN还指定默认的知名度。

注意:更一般地,“符号” - 不是“可变的”,因为extern也可以应用于常量,函数等等。

如果是这种情况,用UIKIT_EXTERN声明所有可用的外部常量是否安全?

简答:这将是很好的做法(读:“安全”),使用这种形式,但它通常是最适合你的图书馆宣布了自己的UIKIT_EXTERN等同。


UIKIT_EXTERN是一个UIKit声明。 图书馆不应该依赖于这个声明,只是定义自己的同义词 - 和许多人,但我觉得它是在C和C更常见++,因为这些程序通常针对更多的平台和iOS程序的一个很好的比例不发育以支持其他平台。否则,由于此声明,不需要UIKit的Objective-C程序可能依赖于UIKit,所以它们将不得不导入UIKit(以便UIKIT_EXTERN的声明可见)。此外,UIKit在iOS程序可以运行的所有平台(即,它可以是C,C++,或依赖基金会并可移植到OS X)上都不可用。因此,即使有人(好奇地)坚持宣称自己是个坏主意,选择CF_EXPORT(CoreFoundation的等价物)将是一个更便携的选项,因为它也可以用于C,C++和OS X.此外,您的库只会需要包含CoreFoundation(至少)。

如果您的库依赖于UIKit,并且该框架必须由您的库导入,那么使用它们的同义词很可能会导致您的库出现问题。

但是这是一个相当大的条件集 - 你的图书馆很容易只声明自己的。简而言之,一个写得很好的便携式库应该(几乎)不会使用'原始'extern,也不应该使用不必要的库依赖关系(在这种情况下是UIKit)。

这将是一个糟糕的设计选择使用UIKIT_EXTERN除非您的图书馆都离不开UIKit的 - 如UIView子类的集合。

如果您的库只处理基础类型,那么导入UIKit意味着您的库将在OS X上(不必要地)不可用(直到该UIKit导入被移除)。

那些没有太多使用C语言(包括超集)的经验的人可能不知道符号名称是不同的,所以他们可能直接使用extern。最后,一些程序最初并没有设计用于C和/或Objective-C翻译之外,所以他们可能只是简单地使用extern而没有条件装饰来进行翻译。

最后,UIKIT_EXTERN可能不会做的正是你期望/想要的东西,因为它规定:

  • 的外部C符号
  • 具有缺省可见

要使ObjC翻译可见库符号, 太棒了。

+2

哇,很好的答案。谢谢。 –

+0

@BenCoffman不用谢谢 – justin

1

它主要是使一个类的当前库/可执行外部可见。除非您正在开发图书馆,否则您可能不需要使用它。如你所指出的那样,使用宏的主要优点是它建立在额外的C++ extern保护之下,所以如果你的确在开发一个库,这绝对是一个好主意(否则调用者必须意识到并添加extern C声明)。

这涵盖了ADC文档在这里:

和是相当不错的在这里找到答案: