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

または(ISO C90 -std=c89-ansi可変個引数マクロをサポートしない古いバージョンのC)を使用すると、コンパイラエラーが発生します。

error: too many arguments provided to function-like macro invocation
    NSAssert(0, @"%@%@", @"foo", @"bar");

そのコードを-std=c89または-ansiでコンパイルするには、次を使用する必要がありますNSAssert2()

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

Bavariousによる優れた回答。

それに私のシングルビットを追加するだけです。問題に直面している人々のためにToo many arguments provided to function-like macro invocation-std=c89@Bavarous で言及されている部分に注意してください。

これが私が問題を取り除く方法です。

  1. ビルド設定に移動 -> Apple LLVM 6.1
  2. C言語の方言を探す
  3. への変更-std=c99
于 2015-08-10T07:00:06.113 に答える