NSAssert1的参数类型错误

时间:2012-08-02 12:47:25

标签: objective-c long-integer short upcasting

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

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 个答案:

答案 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。这就是为什么你应该插入一个显式的强制转换,或使用不同的格式说明符。