Неверный тип аргумента для 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);
вместо.