可变参数后的参数

时间:2011-05-14 15:31:25

标签: objective-c cocoa variadic

Objective-C,或Cocoa,特别支持可变参数,例如类NSString +(NSString *)stringWithFormat:(NSString *)string, ....上的方法。

现在,我想知道的是,是否可以遵循变量参数必须在方法的最后,或者方法可以继续吗?

例如,假设我有可变方法(使用适当的宏),

- (void)setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION;

如果我想在特定索引处使用它,我可以做这样的事情,

- (void)setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION atIndex:(int)index;

我一直在尝试,这个具体示例不起作用,给我一条错误消息,说“预期';'在方法原型之后“。当然,我可以改变这些争论,以确保可变参数最终,就像这样,

- (void)atIndex:(int)index setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION;

这当然有效,但对我而言,在Cocoa命名惯例中感觉相当陌生 - 这对我来说是一个问题。

谢谢,

1 个答案:

答案 0 :(得分:4)

变量参数必须是最后一个参数。这是因为Objective-C中的一个方法实际上只是伪装的普通C函数,而C在变量参数之后也不允许任何参数。

C不允许它的原因与C支持的调用约定有关。当您调用可变参数函数时,可变参数的数量实际上并不是最初的函数。然后,不同的功能可以以不同的方式解决它。在Objective C中,使用nil终止可变参数是很常见的。 printf函数根据格式字符串计算出传递的参数数量。由于该函数最初不知道有多少可变参数,因此无法在可变参数列表之后知道参数的内存位置。

如果您想了解更多信息,请查看“C呼叫约定”。

(有些人认为这个限制是C语言的“wart”,这是公平的。但是,由于需要ABI兼容性,我们坚持使用它.C ++与可变参数函数有同样的问题。)