Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用目标C变量方法调用宏解析之类的铿锵函数中的错误?_Objective C_Macros_Clang_Xcode7_Xcode7 Beta6 - Fatal编程技术网

Objective c 使用目标C变量方法调用宏解析之类的铿锵函数中的错误?

Objective c 使用目标C变量方法调用宏解析之类的铿锵函数中的错误?,objective-c,macros,clang,xcode7,xcode7-beta6,Objective C,Macros,Clang,Xcode7,Xcode7 Beta6,考虑以下呼吁: NSString* localized = NSLocalizedString([NSString stringWithFormat:@"Hello %@", @"World"], @""); 怎么了?我看不出有什么固有的错误,但编译器/预处理器抱怨传递给它的参数太多。 另一方面,以下两个方面: 显式变量: NSString* string = [NSString stringWithFormat:@"Hello %@", @"World"]; NSString* locali

考虑以下呼吁:

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中得到了这一点,因此它可能是叮当工具链中的一个新错误。

这不是一个错误,而是C预处理器的工作方式。根据C标准:

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

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


HTH

向Apple提交错误报告。@rmaddy我做了,#22418824BTW-NSLocalizedString的第一个参数不应该是字符串文字吗?记住,您可以使用命令行工具
gestrings
生成本地化字符串文件。这意味着它只解析您的源代码文件。基于运行时值定义密钥是没有意义的。是的,在上面的示例中这种意义不强。我本想将格式本身本地化,但这样做是错误的。不过,很酷的虫子<代码>:-)@rmaddy严格地说,你说的不是真的。我可以自己生成字符串文件,并将所有可能的动态值作为字符串。这是可能的。但这是一个正在预处理的
.m
文件。这个预处理器是否应该像熟悉C语法括号一样,扩展为熟悉目标C语法括号?@LeoNatan-这是另一个问题!;-)应该吗?可以吗?请记住,宏扩展是在语法分析之前定义的,因此虽然可以完成,但它并不像听起来那么简单。您还需要确保这样的更改不会破坏任何C宏的用法,记住Objective-C是C的超集,所有标准C都应该编译无误。顺便说一句,苹果最好的修复方法是将
NSLocalizedString
定义为一个内联函数,这既避免了您遇到的问题,又提供了更多的“正常”行为(每个参数只计算一次,等等)。同意,最佳解决方案。@LeoNatan Objective-C完全符合C(接受其他关键字),因此来自C的预处理器应与C中的预处理器完全相同。编写Objective-C代码时,可以依赖C中定义的行为。