Неверный тип аргумента для NSAssert1

Это не дает мне ошибку, но несколько предупреждений, от которых я бы хотел избавиться.

OSErr err = AudioUnitInitialize(toneUnit);
NSAssert1(err == noErr, @"Error initializing unit: %ld", err);

Предупреждение, которое я получаю: Format specifies type 'long' but the argument has type 'OSErr' (aka 'short'), Очевидно, я могу изменить это с помощью long вместо OSErr но мне было интересно, почему я получаю ошибку. Это провокация, поэтому я подумал, что это не должно вызывать никаких проблем.

Кто-нибудь может объяснить?

2 ответа

Решение

Поскольку NSAssert1 является переменной функцией, реализованной в рамках ограничений C, она не может выполнить приведение внутри: невозможно найти тип аргумента, переданного в разделе vararg функции. Компилятор Objective C выполнит продвижение по умолчанию типа перед выполнением вызова, но short преобразуется в intне long по умолчанию. Вот почему вы должны либо вставить явное приведение, либо использовать другой спецификатор формата.

Использование

NSAssert1(err == noErr, @"Error initializing unit: %hd", err);

или же

NSAssert1(err == noErr, @"Error initializing unit: %ld", (long)err);

вместо.

Другие вопросы по тегам