为什么NSAssert1等而不是NSAssert?

时间:2011-06-03 07:00:21

标签: cocoa-touch cocoa nsassert

我认为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有效时,使用NSAssert2NSAssert等有什么意义呢?

如果这很重要,请使用Xcode 4.0和iOS 4.3 SDK。 (如果没有,我会更新标签。)

2 个答案:

答案 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部分。

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

  1. 转到构建设置 - &gt; Apple LLVM 6.1
  2. 查找C语言方言
  3. 更改为-std=c99