1

这不是给我一个错误,而是我想摆脱的几个警告。

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但我想知道为什么我会收到错误。这是一个upcast,所以我认为它不应该引起任何问题。

谁能解释一下?

4

2 回答 2

0

采用

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

或者

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

反而。

于 2012-08-02T12:50:40.263 回答
0

由于NSAssert1是在 C 的约束内实现的可变参数函数,因此它不能在内部执行强制转换:无法找到在函数的可变参数部分传递的参数的类型。Objective-C 编译器将在调用之前执行默认类型提升,但默认情况下short会转换为int,而不是转换为long。这就是为什么您应该插入显式转换或使用不同的格式说明符。

于 2012-08-02T12:51:14.633 回答