如何避免共享库中的功能重新定义?

时间:2013-07-18 09:49:38

标签: ios objective-c xcode

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

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

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

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

注意事项:

  • 我不想为我的函数添加前缀,因为这些函数会在内部广泛使用,会破坏我的代码的语义和可读性。

  • 我知道我可以定义函数'static'和with-in使用它们的类,但是这些函数在很多类中使用,因此这种方法会违反DRY原则。

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

4 个答案:

答案 0 :(得分:3)

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

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

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

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

然后,用户可以根据需要使用您的类执行相同的操作,或者如果他们想要更改功能,则可以扩展功能。您的库仍将使用您创建的类,因此不应有交叉线。

答案 1 :(得分:1)

尽管你想避免这个解决方案,但我怀疑最容易的是为这些函数的名称添加一个足够唯一的前缀(假设C和Objective-C都没有名称空间)。

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

#define DegreesToRadians() HLDegreesToRadians()

答案 2 :(得分:1)

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

例如:

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

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

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

关于这个与使用宏的好处是自动完成仍然可以正常工作,并且逗号没有奇怪。

答案 3 :(得分:0)

  

我宁愿不为我的函数添加前缀,因为这些函数在内部广泛使用,会破坏我的代码的语义和可读性。

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

  

我知道我可以定义函数'static'和with-in使用它们的类,但是这些函数在很多类中使用,所以这种方法会违反DRY原则。

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