7

我以为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 一起使用。(如果没有,我会更新标签。)

4

2 回答 2

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要使用or编译该代码-ansi,您需要使用NSAssert2()

NSAssert2(0, @"%@%@", @"foo", @"bar");
于 2011-06-03T07:29:14.017 回答
0

巴伐利亚的优秀答案。

只需添加我的一点。对于面临问题的人Too many arguments provided to function-like macro invocation-std=c89注意@Bavarious提到的部分。

这是我摆脱这个问题的方法。

  1. 转到构建设置-> Apple LLVM 6.1
  2. 查找C语言方言
  3. 改成-std=c99
于 2015-08-10T07:00:06.113 回答