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命名惯例中感觉相当陌生 - 这对我来说是一个问题。
谢谢,
答案 0 :(得分:4)
变量参数必须是最后一个参数。这是因为Objective-C中的一个方法实际上只是伪装的普通C函数,而C在变量参数之后也不允许任何参数。
C不允许它的原因与C支持的调用约定有关。当您调用可变参数函数时,可变参数的数量实际上并不是最初的函数。然后,不同的功能可以以不同的方式解决它。在Objective C中,使用nil
终止可变参数是很常见的。 printf
函数根据格式字符串计算出传递的参数数量。由于该函数最初不知道有多少可变参数,因此无法在可变参数列表之后知道参数的内存位置。
如果您想了解更多信息,请查看“C呼叫约定”。
(有些人认为这个限制是C语言的“wart”,这是公平的。但是,由于需要ABI兼容性,我们坚持使用它.C ++与可变参数函数有同样的问题。)