我对一种语法感到困惑,只是想知道以下两种语法之间的区别。
#define objKeys @[@"key1",@"key2",@"key3"]
#define dicWithValue1(val1,val2,val3) [NSMutableDictionary dictionaryWithObjects:@[val1,val2,val3] forKeys:objKeys]
#define dicWithValue2(objArray) [NSMutableDictionary dictionaryWithObjects:objArray forKeys:objKeys]
-(void)someFunction
{
NSMutableArray *arrValues = [[NSMutableArray alloc] init];
[arrValues addObject:dicWithValue1(@"val1",@"val2",@"val3")]; // STATEMENT 1
[arrValues addObject:dicWithValue1(@[@"val1",@"val2",@"val3"])]; // STATEMENT 2
// Below Statements will give error... for Multiple Arguments..
[arrValues addObject:dicWithValue2(@"val1",@"val2",@"val3")]; // STATEMENT 3
[arrValues addObject:dicWithValue2(@[@"val1",@"val2",@"val3"])]; // STATEMENT 4
}
问题1:语句2将在运行时使应用程序崩溃,但是在编译时没有给出任何错误。那么,陈述1和陈述2有什么区别?
问题2:如何在#define函数中传递数组对象,如语句3和4给出多个参数的编译错误。
最佳答案
首先提示一下,您可以使用gcc -E在文件上运行预处理器,这将扩展所有宏,以使您很容易看到问题出在哪里:
gcc -E -o outfile.m myFile.m
如果您将编写的代码放入文件中并运行此命令,则将收到有关您的问题的所有错误消息。如果您对错误消息有疑问,可以询问他们。
您会陷入困境,因为宏不能忽略逗号。因此,@[@"val1",@"val2",@"val3"]
将三个参数传递给宏,即arg1:@[@"val1"
arg2:@"val2"
arg3:@"val3"]
,您可以通过以下操作用括号来解决此问题:(@[@"val1", @"val2", @"val3"])
[arrValues addObject:dicWithValue2((@[@"val1",@"val2",@"val3"]))]; \\Statement 4
Here's文档,其中包含有关逗号问题的部分。