Objective c 可变参数后的参数

Objective c 可变参数后的参数,objective-c,cocoa,variadic,Objective C,Cocoa,Variadic,Objective-C,特别是Cocoa,支持可变参数,例如NSString+(NSString*)stringWithFormat:(NSString*)string,….上的类方法 现在,我想知道的是,是否有可能,变量参数必须在方法的末尾,或者在那之后,方法可以继续吗 作为一个例子,假设我有一个变量方法(使用适当的宏) 如果我想在一个特定的索引中使用它,我可以这样做吗 - (void)setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION at

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

现在,我想知道的是,是否有可能,变量参数必须在方法的末尾,或者在那之后,方法可以继续吗

作为一个例子,假设我有一个变量方法(使用适当的宏)

如果我想在一个特定的索引中使用它,我可以这样做吗

- (void)setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION atIndex:(int)index;
- (void)atIndex:(int)index setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION;
我一直在尝试,但这个特定的示例不起作用,给我一条错误消息,上面写着“Expected”;“after method prototype”。当然,我可以把这些论点混在一起,确保变量在最后,就像这样

- (void)setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION atIndex:(int)index;
- (void)atIndex:(int)index setObjects:(id)obj, ... NS_REQUIRES_NIL_TERMINATION;
这当然行得通,但对我来说,在可可命名惯例中,这感觉相当陌生——这对我来说是个问题


谢谢,

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

C不允许它的原因与C支持的调用约定有关。当你调用一个变量函数时,变量参数的数量在一开始并不是已知的。然后,不同的函数可以用不同的方式来计算它。在目标C中,用
nil
终止变量参数是常见的。
printf
函数根据格式字符串计算它传递了多少个参数。由于函数最初不知道有多少可变参数,因此无法知道可变参数列表后参数的内存位置

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


(一些人认为这个限制是C语言的一个“疣”,这是公平的,但是,由于需要ABI兼容性,我们会被它所困扰。C++与变量函数有相同的问题。)< > > > >代码> ->(空)SETObjutStCindex:(int)索引SETObjes:(ID)Obj.,…NS_要求_NIL_终止?…或任何其他组合,真的。然而,让名字变得漂亮——尽管它很重要——并不是这里真正困难的部分。不过,谢谢你。我明白了,你应该考虑到它背后隐藏的C函数。可惜。。。好的,谢谢!