2011-06-03 49 views
7

我想NSAssert不能使用printf符,但這:爲什麼NSAssert1,而不是NSAssert?

NSAssert(0, @"%@%@", @"foo", @"bar"); 

的作品,就像你所期望的:

*** Assertion failure in -[MyClass myMethod], <Path>/MyClass.m:84 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
    reason: 'foobar' 

那麼,什麼是使用NSAssert1NSAssert2等時NSAssert點作品?

這與Xcode 4.0和iOS 4.3 SDK,如果有關係。 (如果沒有,我將更新標籤。)

回答

17

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"); 

對於鱈魚E要與-std=c89-ansi編譯,你需要使用NSAssert2()

NSAssert2(0, @"%@%@", @"foo", @"bar"); 
0

優秀的回答Bavarious。

只需添加我的單一位。 針對面臨問題的人Too many arguments provided to function-like macro invocation。 請注意@Bavarious提到的作爲-std=c89的部分。

下面是我如何擺脫這個問題。

  1. 轉到構建設置 - >蘋果LLVM 6.1
  2. 查找C語言方言
  3. 更改爲-std=c99
相關問題