我以为NSAssert不能使用printf说明符,但这是:
NSAssert(0, @"%@%@", @"foo", @"bar");正如您所期望的那样:
*** Assertion failure in -[MyClass myMethod], <Path>/MyClass.m:84
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'foobar'那么,当NSAssert正常工作时,使用NSAssert1、NSAssert2等有什么意义呢?
对于Xcode4.0和iOS 4.3SDK,如果这很重要的话。(如果没有,我将更新标记。)
发布于 2011-06-03 15:29:14
当前版本的NSAssert()使用预处理器变量宏,即__VA_ARGS__。由于可变宏是C99的一个特性,我猜测老版本的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");发布于 2015-08-10 15:00:06
Bavarious回答得很好。
只是添加了我的一小部分。对于那些面临Too many arguments provided to function-like macro invocation问题的人。请注意@Bavarious提到的-std=c89部分。
这是我如何摆脱这个问题的。
https://stackoverflow.com/questions/6224002
复制相似问题