2013-01-17 11 views
7

2番目のパラメータが変数として渡された場合にはうまく動作する特定のメッセージで、Use of undeclared identifier 'NSLocalizedString'Too many arguments provided to function-like macro invocationで失敗します設定されました。私は変数を使ってコードを作業していますが、それは他の状況でそれを避ける方法を知らない理由を理解したいだけです。次の宣言ではNSLocalizedString - 宣言されていない識別子の問題の使用

NSString *branchTitle = [branchDictionary objectForKey:@"Title"]; 
NSString *localString = [NSMutableString stringWithFormat:@"%@ node title", branchTitle]; 

これは、エラーなしで正常に動作します:

[navItem setTitle:NSLocalizedString(branchTitle, localString)]; 

...が、私と同じようであるこれは、上述のエラーで失敗します。

[navItem setTitle:NSLocalizedString(branchTitle, [NSMutableString stringWithFormat:@"%@ node title", branchTitle])]; 

ここと他の箇所で検索してもわかりません。私はそれぞれのエラーメッセージと様々なNSLocalizedStringの問題について数多くヒットしましたが、それらを結びつけたものは何もありません。 2番目のエラーメッセージについては、clangの問題と文中のコンマの数が含まれていることがわかりました。これは、余分なカンマがNSMutableStringメッセージ内にあっても、まだNSLocalizedStringによって余分なパラメータとして見られていたことを示しています。それは意味をなさないでしょうか?

質問には重要ではありませんが、この文は、辞書から取得した英語バージョンに基づいてナビゲーションバータイトルのローカライズ版を設定することを目的としています。 NSMutableString部分は、英語のタイトルに基づいてローカライズのコメントを定義します。

編集:この問題を解決した後、以下の受諾された回答ごとに別の関連する問題が発生しました。 localStringの宣言では、明らかに使用されていましたが、"Unused variable"コンパイラ警告が生成されていました。これはCマクロの中にあり、完全性のために、私はこの警告を抑止する方法について関連する投稿へのリンクを追加しています。How can I get rid of an “unused variable” warning in Xcode

答えて

14

これはCマクロの不正な展開の結果だと思います。実際には、あなたが書く場合:

NSLocalizedString(branchTitle, ([NSString stringWithFormat:@"%@ node title", branchTitle])); 

これはコンパイルされます。何らかの理由で、プリプロセッサは、(それがObjective-Cの呼び出しについて知っていない可能性があるため)[]内だけでなく、テキストを処理していないと別の引数として[]内のすべての要素を扱います:

#define NSLocalizedString(key, comment) \ 
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil] 

PS:私が書きました

マクロの展開は、厄介なコーナーケースとあなたは非常に微妙な方法で間違ったプリプロセッサの拡張アルゴリズムを最適化するために、気の利いた方法だと思ったものをレンダリングするような状況に満ちトリッキーな操作です:悪いC-マクロ展開、私はthisを意味しました。

+2

ニースは、カッコのセットを追加するだけで修正されます。 NSLocalizedStringはObjective-Cの中で私が意図して使った最初のCマクロです。他の人が動いているときに気をつける良いヒントです。ありがとう! –

+0

助けてくれると嬉しいです! – sergio

関連する問題