如何使C函数和预处理器宏可用于多个Objective-C类?

时间:2015-09-22 15:28:40

标签: objective-c c import c-preprocessor

我有一个 C 函数和一个宏:

double degreesFromRadians(double radians) { return (radians * 180.0 / M_PI ) ;
#define FPROUND(doubleA, doubleB) round( (doubleA) * pow(10.0,doubleB))

我在我的一个Objective-C模型类中使用它。我也希望它们可以在我的单元测试类中用于一些与模型类无关的其他测试。

不想复制代码,我尝试将其放入单独的MyAppMathFunctions.c文件中,并将#import放入模型类中。

现在使用Xcode(版本7.0)构建应用程序失败,并显示链接器错误:

duplicate symbol _degreesFromRadians in MyAppMathFunctions.o  and ...modelClass.o  

毋庸置疑,由于失败,我没有像我原先计划的那样将#import MyAppMathFunctions.c放入我的单元测试课程中。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

将此代码移动到C文件不是一个好方法,因为C文件不应包含在其他翻译单元中。这样做会创建重复的符号,但更重要的是,它会在代码的读者之间造成混淆。

解决此问题的一种方法是将定义放入带有inline修饰符的头文件中,然后使用extern声明在一个翻译单元中提供该函数的定义:

appmath.h:

#define FPROUND(doubleA, doubleB) round( (doubleA) * pow(10.0,doubleB))
inline double degreesFromRadians(double radians) {
    return (radians * 180.0 / M_PI );
}

appmath.c

#include "appmath.h"
extern double degreesFromRadians(double radians);

这样,您的函数体仍可供编译器使用,以便在所有翻译单元中进行内联,并且在链接代码时不会出现重复的符号。