这不是给我一个错误,而是我想摆脱的几个警告。
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
来改变这一点,但我想知道为什么我会收到错误。这是一个上调,所以我认为它不应该导致任何问题。
任何人都可以解释一下吗?
答案 0 :(得分:0)
使用
NSAssert1(err == noErr, @"Error initializing unit: %hd", err);
或
NSAssert1(err == noErr, @"Error initializing unit: %ld", (long)err);
代替。
答案 1 :(得分:0)
由于NSAssert1
是在C的约束内实现的variadic function,因此它无法在内部执行转换:无法找到函数的vararg部分中传递的参数类型。 Objective-C编译器将在进行调用之前执行默认类型促销,但short
默认情况下转换为int
,而不是long
。这就是为什么你应该插入一个显式的强制转换,或使用不同的格式说明符。