gpt4 book ai didi

cocoa-touch - 为什么 NSAssert1 等而不是 NSAssert?

转载 作者:行者123 更新时间:2023-12-03 16:06:56 25 4
gpt4 key购买 nike

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

如果重要的话,可以使用 Xcode 4.0 和 iOS 4.3 SDK。 (如果没有,我会更新标签。)

最佳答案

当前版本的 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");

关于cocoa-touch - 为什么 NSAssert1 等而不是 NSAssert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com