2012-03-21 12 views
0

特定のものをファイルに記録するカスタムロギングクラスを作成しました。私はマクロを作って、NSLog()のようなカスタムクラスを使用できるようにしようとしていますが、正しく動作していないようです。ここでカスタムロギングマクロが複数の引数を受け付けない

は、私はマクロを定義しています方法は次のとおりです。

#define ECLog(fmt, ...) [ECLogger logText:fmt, ## __VA_ARGS__] 

logText:はこのように宣言されています

+ (void)logText:(NSString *)theString; 

私は一つの引数を渡すと、それが正常に動作します。このように:

ECLog(@"test"); 

しかし、私は別の引数を渡す場合は、次のように:

ECLog(@"test %@",someString); 

私はそれだけで一つの引数を期待していたというエラーが発生します。

アイデア?

+0

マクロではなくメソッド呼び出しに関するエラーが発生しますか? 'logText:'はどのように宣言されていますか? –

+0

はい、マクロについてです。 'logText:'がどのように宣言されているかを示す私の投稿を更新しました。 – edc1591

答えて

2

いいえ、警告はメソッド呼び出しに関するものです。このエラーは、プリプロセッサが処理される前にコードを表示しているためですが、コンパイラが同じ行を指している、後処理しているためです。

このメソッドは1つの引数を取ると宣言しましたが、それ以上の値を渡しています。今、あなたがそのよう自分でそれをタイプしたいかのように、コンパイラに渡されるリテラルテキストです

[ECLogger logText:@"test %@", someString]; 

ECLog(@"test %@", someString); 

はにプリプロセッサによって書き換えられます。このメソッドは単一のNSStringを取ると宣言されていますが、2つの方法を渡しています。メソッドの宣言を変更する必要があります。

+ (void) logText: (NSString *)theString, ...; 
+0

OK、それはエラーを処理しますが、私の 'logText:'メソッドですべての引数を1つの 'NSString'にまとめるにはどうすればいいですか? – edc1591

+0

どのように前にそれをやっていたのですか?引数を 'logText:'の中の 'va_list 'として処理していませんか? –

+0

いいえ、私は 'theString'を取り出してファイルに書き出していました。 – edc1591

関連する問題