2

考虑以下调用:

NSString* localized = NSLocalizedString([NSString stringWithFormat:@"Hello %@", @"World"], @"");

它有什么问题?我看不出任何本质上的错误,但是编译器/预处理器抱怨传递给它的参数太多。另一方面,以下两个编译:

显式变量:

NSString* string = [NSString stringWithFormat:@"Hello %@", @"World"];
NSString* localized = NSLocalizedString(string, @"");

用括号括起来:

NSString* localized = NSLocalizedString(([NSString stringWithFormat:@"Hello %@", @"World"]), @"");

看起来预处理器/编译器错误地解析了,字符。

我在 Xcode 7 beta 6 中得到了这个,所以它可能是 Clang 工具链中的一个新错误。

4

1 回答 1

2

这不是错误,它是 C 预处理器的工作方式。来自 C 标准:

由最外面的匹配括号界定的预处理标记序列形成了类函数宏的参数列表。列表中的各个参数由逗号预处理标记分​​隔,但匹配内括号之间的逗号预处理标记不分隔参数。

所以逗号分隔宏参数,除非它们在匹配的内括号内 - 这是你的“用括号括起来”变体作品。C 不讨论匹配括号,[& ],只有括号,(& ),所以你的第一个例子有三个宏参数[NSString stringWithFormat:@"Hello %@"@"World"]@""。预处理发生语法分析之前,因此前两个参数在 (Objective-)C 中没有语法意义的脂肪并不重要。

HTH

于 2015-08-25T16:24:05.653 回答