如何将可变数量的args传递给可变参数函数

时间:2011-01-16 04:51:46

标签: objective-c c variadic-functions

我有一个带有签名的可变函数:

- (id)initWithNumVertices:(NSUInteger)inCount, ...;

但我无法弄清楚如何从变量顶点数构建省略号部分。怎么办呢?

编辑:抱歉,我没有要求编写此函数的方法,我正在寻找一种方法来调用它,使用未知数量的变量。该函数采用结构而不是对象。

如果参数的数量已知,我可以这样做:

[[MyObject alloc] initWithNumVertices:4, v[0], v[1], v[2], v[3]];

但是当顶点的数量未知时我该如何调用呢?

4 个答案:

答案 0 :(得分:4)

如果在编译时不知道参数的数量,我认为不可能调用可变参数函数。如果要避免使用NSArray的开销,将多个C结构传递给方法的标准方法是使用标准C数组。

- (id)initWithVertices:(Vertex *)vertices count:(NSUInteger)count;

NSIndexPath的{​​{1}}是一个使用此模式的示例,还有其他各种模式,在Cocoa中相当常见。

答案 1 :(得分:1)

编辑:只使用原生C数组。可变方法对你没有帮助。


在您的情况下,由于您有一个未指定数量的参数,您必须以这种形式重写它:

- (id)initWithVertices:(vertex)firstVertex;

运行一个while循环,直到它到达指定为非法的顶点(这将是你的断点),有点像这样:

vertex currentVertex, invalidVertex = // some invalid value, like {-1, -1}
while ((currentVertex = va_arg(args, vertex) != invalidVertex) {
    // initialization code with the current vertex
    // when we hit 'invalidVertex', which will be at the end of the list, stop
}  
像这样的代码必须像这样运行:

[[MyObject alloc] initWithVertices:firstVertex, secondVertex, thirdVertex, nullVertex];

nullVertex必须位于列表的末尾才能指定最后一个有效顶点(很像NSArray的{​​{1}}方法必须arrayWithObjects:在列表的末尾)。

答案 2 :(得分:0)

您是否在询问如何区分参数?

[[YourObject alloc] initWithNumVertices:7, 8, 9, 10];

编辑|哦,我想我明白了你在问什么。您想动态调用此方法,例如使用objc_msgSend()NSInvocation?如果是这样的话,请忽略我的答案。

答案 3 :(得分:0)

如果你还没有,请查看libffi(`man ffi'):

  

说明        外部函数接口提供了一种机制   函数可以生成一个调用   运行时的另一个函数没有   需要知识        编译时调用函数的接口。

如果我理解正确,您应该可以使用此方法调用objc_msgSend()