我认为NSAssert
无法使用printf
说明符,但是:
NSAssert(0, @"%@%@", @"foo", @"bar");
正如您所期望的那样工作:
*** Assertion failure in -[MyClass myMethod], <Path>/MyClass.m:84
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'foobar'
那么当NSAssert1
有效时,使用NSAssert2
,NSAssert
等有什么意义呢?
如果这很重要,请使用Xcode 4.0和iOS 4.3 SDK。 (如果没有,我会更新标签。)
答案 0 :(得分:18)
当前版本的NSAssert()
使用预处理器可变参数宏,即__VA_ARGS__
。由于可变参数宏是C99功能,我的猜测是旧版本的SDK不允许NSAssert()
中的变量参数,因此需要NSAssert1()
,NSAssert2()
等。
如果您尝试编译
NSAssert(0, @"%@%@", @"foo", @"bar");
使用-std=c89
或-ansi
(ISO C90,不支持可变参数宏的旧版C),会出现编译错误:
error: too many arguments provided to function-like macro invocation
NSAssert(0, @"%@%@", @"foo", @"bar");
要使用-std=c89
或-ansi
进行编译,您需要使用NSAssert2()
:
NSAssert2(0, @"%@%@", @"foo", @"bar");
答案 1 :(得分:0)
优秀的回答作者:Bavarious。
只需添加我的单个位即可。
对于面临问题Too many arguments provided to function-like macro invocation
的人。
请注意@Bavarious提到的-std=c89
部分。
以下是我摆脱这个问题的方法。
-std=c99