ios - 如何在#define中将整个数组作为参数传递?

标签 ios objective-c syntax c-preprocessor

我对一种语法感到困惑,只是想知道以下两种语法之间的区别。

#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文档,其中包含有关逗号问题的部分。

关于ios - 如何在#define中将整个数组作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29229765/

相关文章:

ios - NSNumber 实例不会保留值

scala - Scala中的自定义 "let"表达式

iphone - 可以在另一个 iOS 应用程序中加载一个 iOS 应用程序(通过应用程序内购买/订阅)吗?

ios - 将 AnyObject/NSDictionary (JSON) 转换为字符串?

iphone - Obj-C,在上传包含行的数组后刷新表的一部分?

objective-c - Google Drive API - Objective C - 例子?

ruby - 在 Ruby 中,如何跳过 .each 循环中的循环,类似于 'continue'

ios - Swift 语法问题 : Nested class type cannot be used when declaring variables of that type

ios - 推送通知中的应用程序名称错误 | ios SWIFT

ios - 在 CLLocationDistance 中从 Km 更改为 Miles