Аргументы после аргументов - PullRequest
2 голосов
/ 14 мая 2011

Objective-C, или, в частности, Какао, поддерживает переменные аргументы, как, например, класс метод 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;

Это, конечно, работает, но для меня это кажется довольно чуждым среди соглашений о присвоении имен Какао -что для меня проблема.

Спасибо,

1 Ответ

4 голосов
/ 14 мая 2011

Вариативные аргументы должны быть последним аргументом.Это потому, что метод в Objective-C на самом деле является просто замаскированной обычной функцией C, и C также не допускает никаких аргументов после аргумента с переменным числом аргументов.

Причина, по которой C не позволяет делать этос соглашением о вызовах, которое поддерживает C.Когда вы вызываете функцию с переменными числами, число параметров с переменными числами фактически не известно, будь то функция на первых порах.Различные функции могут понять это по-разному.В Objective C завершение аргумента с помощью nil является обычным делом.Функция printf выясняет, сколько аргументов передано на основе строки формата.Поскольку функция изначально не знает, сколько существует аргументов с переменными числами, она не может узнать местоположение в памяти аргумента после списка аргументов с переменными числами.

Просмотрите «Соглашения о вызовах C», если хотитезнаю больше.

(Некоторые считают это ограничение «бородавкой» языка C, что справедливо. Однако мы застряли с ним из-за необходимости совместимости с ABI. С ++ имеет такую ​​же проблему спеременные функции.)

...