Нет, проверить невозможно. Это потребует нового синтаксиса в компиляторе. По сути, вы хотите, чтобы «эти аргументы были необязательными / переменными, но должны следовать шаблону этого типа».
Также обратите внимание на то, что трактовка определенного типизированного списка аргументов как va_list
также технически некорректна. Это будет работать по совпадению на большинстве ABI, но не на всех. (Не то, чтобы вы это делали, но это часто встречается в этих контекстах).
Можете ли вы дать мне пример того, что вы имеете в виду под специально напечатанным
список аргументов?
Конечно, рассмотрим:
id objc_msgSend(id,SEL,...);
Это список аргументов var-args. Теперь вы можете подумать, что можете сделать это:
objc_msgSend(mutableArray, @selector(addObject:), anObject);
Но технически вы не можете. varargs не совместимы со специально типизированными списками аргументов, согласно спецификации C. Таким образом, вам нужно набрать:
void (*func)(id,SEL,id) = (void*)objc_msgSend;
func(mutableArray, @selector(addObject:), anObject);
То есть, если вызываемый API имеет значение , а не также varargs, то сайт вызова должен быть скомпилирован с объявлением вызова с полной информацией о типе аргумента ...