0

在我的 Xcode 项目中,我使用以下 C 实用程序函数制作了一个独立的头文件:

#ifndef FOO
#define FOO
CGFloat DistanceBetweenTwoPoints(CGPoint p1, CGPoint p2)
{
    CGFloat dx = p2.x - p1.x;
    CGFloat dy = p2.y - p1.y;
    return sqrt(dx*dx + dy*dy);
};
#endif

即使使用预处理器指令,如果我尝试在多个位置importinclude该头文件,我也会收到以下错误,抱怨重复符号:

linker command failed with exit code 1

有没有不同的方法可以达到这种效果?这个问题是出于好奇。

谢谢

4

2 回答 2

1

由于函数的定义在标头中,因此您可以在包含该函数的每个文件(实际上是每个翻译单元)中获得该函数的一个定义。

将函数体移动到“.c”文件中,在标题中留下声明,或者声明它inline

于 2012-10-08T13:34:36.473 回答
1

将您的函数体放在一个.c文件中,并将函数声明(又名原型)放在.h这些文件中#ifndef,等等。然后用于include在您需要该函数的地方导入头文件。

记得检查文件的目标成员.c,否则不会编译。

对于像这样的小函数,您可以声明它inline并使用头文件:

inline CGFloat DistanceBetweenTwoPoints(CGPoint p1, CGPoint p2)
{
    // code as is
}

编译器将用函数代码替换您的函数调用,而无需实际构建和链接新的目标文件。不再有重复的符号。

于 2012-10-08T13:35:39.200 回答