如何制作像CGRectMake(iphone)这样的结构制作者

And*_*obs 8 iphone struct typedef makefile objective-c

我有一个带有两个CGFloat的结构HLRange

struct HOLRange
{
CGFloat min;
CGFloat max;
};
typedef struct HOLRange HOLRange;
Run Code Online (Sandbox Code Playgroud)

但我如何制作像HLRangeMake(1,2)这样的函数; ..喜欢CGRectMake?

- 编辑 -

我的头文件

#import <Foundation/Foundation.h>

struct HOLRange
{
    CGFloat min;
    CGFloat max;
};
typedef struct HOLRange HOLRange;

HOLRange HOLRangeMake(CGFloat min, CGFloat max) {
    HOLRange range;
    range.min = min;
    range.max = max;
    return range;
 }

@interface Structs : NSObject {

}

@end


error message: ld: duplicate symbol _HOLRangeMake in             /Users/Documents/projects/iphone/test/catalog/base1/build/base1.build/Debug-iphoneos/base1.build/Objects-normal/armv6/base1AppDelegate.o and /Users/Documents/projects/iphone/test/catalog/base1/build/base1.build/Debug-iphoneos/base1.build/Objects-normal/armv6/main.o
Run Code Online (Sandbox Code Playgroud)

Ole*_*ann 16

HOLRange HLRangeMake(CGFloat min, CGFloat max) {
    HOLRange range;
    range.min = min;
    range.max = max;
    return range;
}
Run Code Online (Sandbox Code Playgroud)

  • 链接器抱怨重复的符号,因为您要在多个其他文件中导入头文件,这会导致多次定义该函数.只将函数声明放在头文件中:`HOLRange HOLRangeMake(CGFloat min,CGFloat max);`并将函数定义移动到实现文件中. (4认同)

Vla*_*mir 7

您可以在CGGeometry.h中看到CGRectMake源代码,因此您可以执行相同的操作:

CG_INLINE CGRect
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
  CGRect rect;
  rect.origin.x = x; rect.origin.y = y;
  rect.size.width = width; rect.size.height = height;
  return rect;
}
Run Code Online (Sandbox Code Playgroud)

编辑:您必须将函数定义为内联或将其实现移动到.m文件.当您在导入HoleRange.h(?)标头的每个编译单元中定义函数时,您将收到链接器错误.


Bel*_*oda 5

老帖子.但是,我想与未来的观众分享我解决这个问题的方法.

typdef struct _HOLRange {
    CGFloat min;
    CGFloat max;
} HOLRange;

static inline HOLRange(CGFloat min, CGFloat max) {
    return (HOLRange) {min, max};
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样定义你的stuct和Make函数.简短快捷.