2013-01-17 61 views
7

我在,如果第二個參數作爲變量傳遞工作正常特定郵件使用NSLocalizedString,但失敗,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])]; 

在這裏和其他地方搜索我還沒有找到解釋。我通讀了各種錯誤消息和各種問題的點擊次數,但沒有將它們綁定在一起。我發現第二條錯誤消息的含義可能與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