2

Objective-C,或者具体来说是 Cocoa,支持可变参数,例如 class the method on 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 命名约定中感觉相当陌生——这对我来说是个问题。

谢谢,

4

1 回答 1

4

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

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

如果您想了解更多信息,请查阅“C 调用约定”。

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

于 2011-05-14T15:42:45.527 回答