gpt4 book ai didi

objective-c - 可变参数之后的参数

转载 作者:行者123 更新时间:2023-12-03 16:29:39 24 4
gpt4 key购买 nike

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;

我一直在尝试,但这个特定的示例不起作用,给我一条错误消息,显示“Expected ';'”在方法原型(prototype)之后”。当然,我可以打乱参数以确保可变参数位于末尾,如下所示,

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

这当然有效,但对我来说,它在 Cocoa 命名约定中感觉相当陌生——这对我来说是一个问题。

谢谢,

最佳答案

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

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

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

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

关于objective-c - 可变参数之后的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6002819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com