1

我正在用 Objective-C 编写一个开源 iOS 库,我最终打算上传到 github。我的库依赖并定义了某些功能,例如...

CGFloat DegreesToRadians(CGFloat degrees);
UIColor RGB(int r, int g, int b);

这一切都很好,但是当有人将我的库添加到他们的项目中时,如果他们也定义了一个DegreesToRadiansRGB函数,或者他们正在使用另一个定义它们的库,那么就会出现Redfinition of DegreesToRadians编译错误。

无论如何我是否能够组织我的函数的定义,使用适当的关键字,以某种方式使用#ifndef,移动#import语句或任何其他解决方案,以便这些函数仅在我的库内部有效地存在并且不会暴露在外部,因此不会引起冲突吗?

注意事项:

  • 我不想给我的函数加上前缀,因为它们在内部被广泛使用,并且会破坏我的代码的语义和可读性。

  • 我知道我可以在使用它们的类中定义函数“静态”和 with-,但这些函数在许多类中使用,因此这种方法会违反 DRY 原则。

  • 在理想情况下,用户不想修改我的库代码以避免此错误,因此让用户只注释掉我的库代码或其他潜在冲突库代码中的定义是不可接受的。

4

4 回答 4

3

最简单的方法是将这些函数定义包含在私有头文件中。

.h将它们定义的位置添加到库配置的“私有标头”部分。然后,使用您的库的用户将看不到它们。

如果你想暴露它们,但仍然担心冲突,你为什么不把它们移到课堂上呢?我知道它们是不同的函数,但你可以将它们作为对象的函数移动到类中,例如

MyConverter
- (CGFloat)radiansFromDegrees:(CGFloat)degrees;

然后,用户可以根据需要使用您的类来做同样的事情,或者如果他们想更改功能,可以扩展功能。您的库仍将使用您创建的类,因此不应有交叉线。

于 2013-07-18T09:55:32.227 回答
1

将您的函数实现放在头文件中并将它们声明为静态。

例如:

static UIColor *RGB(int r, int g, int b) {
   // blah...
}

该名称RGB不会从包含标头的编译单元中导出,因此如果在其他地方使用相同的名称,您将不会遇到链接器错误。

只要您的函数很小,对代码大小的影响就会很小。否则,您可以从静态函数调用正确前缀的函数。

与使用宏相比,这一点的好处是自动完成仍然可以正常工作,并且逗号没有奇怪之处。

于 2013-07-18T10:33:39.183 回答
1

尽管您想避免这种解决方案,但我怀疑最简单的方法是为这些函数的名称添加一个足够独特的前缀(假设 C 和 Objective-C 都没有namespaces)。

如果您想提高代码的可读性,可以在私有标头中添加以下宏:

#define DegreesToRadians() HLDegreesToRadians()
于 2013-07-18T10:01:38.103 回答
0

我不想给我的函数加上前缀,因为它们在内部被广泛使用,并且会破坏我的代码的语义和可读性。

只需为全局可见的内容(或命名空间,如果您使用 C++)添加前缀。

我知道我可以在使用它们的类中定义函数“静态”和 with-,但这些函数在许多类中使用,因此这种方法会违反 DRY 原则。

这些都可能是单行的。只需将它们放在私有标头中并声明它们static。然后,您可以在*.m文件中导入此标头。客户不需要看到这些,因为它们是static你可以省略前缀。

于 2013-07-18T11:18:41.023 回答