这并没有给我一个错误,但我想消除几个警告。
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
来改变这一点,但我想知道为什么会出现错误。这是一个升级,所以我认为它不应该引起任何问题。
有人能解释一下吗?
由于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);
相反。