NSLocalizedString - 使用未声明的标识符问题

时间:2013-01-17 17:28:33

标签: objective-c cocoa-touch nslocalizedstring

我在特定消息中使用NSLocalizedString如果第二个参数作为变量传递,则工作正常;但如果第二个参数完全写入,则Use of undeclared identifier 'NSLocalizedString'Too many arguments provided to function-like macro invocation失败与设置的变量相同。我有使用变量的工作代码,这很好,我只是想了解在其他情况下无法知道如何避免它的原因。

使用以下声明:

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问题的一些点击,但没有任何内容将它们联系在一起。我发现的第二个错误消息暗示可能是clang的问题和语句中逗号的数量,表明即使额外的逗号在NSMutableString消息中,它仍被视为额外的参数NSLocalizedString。这有什么意义吗?

对于该问题并不重要,但该声明旨在根据从字典中提取的英语版本设置导航栏标题的本地化版本,该字典因不同视图而异。 NSMutableString部分根据英文标题定义本地化的评论。

编辑:根据下面接受的答案解决了这个问题后,我注意到了另一个相关问题。 localString的声明产生了"Unused variable"编译器警告,但显然正在使用它。这也是因为它在C-macro范围内并且为了完整性,我在这里添加了一个关于抑制该警告的相关帖子的链接:How can I get rid of an “unused variable” warning in Xcode

1 个答案:

答案 0 :(得分:14)

我认为这是C-macro扩张不良的结果。的确,如果你写:

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

这将编译。出于某种原因,预处理器不能很好地处理[]中的文本(可能因为它不了解Objective-C调用)并将[]中的所有元素视为单独的参数:

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

PS:当我编写糟糕的C-macro扩展时,我的意思是this

  

宏扩展是一个棘手的操作,充满了令人讨厌的极端情况和情况,这些情况使得您认为这是一种非常好的方式来以非常微妙的方式优化预处理器的扩展算法。