如何编写一个将检查重复的宏?

时间:2015-09-29 13:53:30

标签: objective-c macros

我想写一个宏来检查宏之间的if语句是否是唯一的

宏之间的语句如下

if([myString isEqualToString:@"one"]){
//do something
}
if ([myString isEqualToString:@"two"]){
//do two somethings
}

我想把我的ifs放在某个东西中,以确保我没有两个ifs在这个区块内检查相同的东西。

这可能吗?

修改 我希望我的宏可以执行以下操作

在对象o上启动宏 使用键" o"创建一个字典。和价值
对于宏括号之间的每个if语句,"值"在给定数组中检查它是否存在,将其推入,否则给出一个#warning类型宏,表明该值已经在里面。

结束宏并从内存中删除上述字典。

1 个答案:

答案 0 :(得分:2)

这是一个更大的关注点,确保您安全地处理类似字符串的比较。关注是好的,但宏完全是试图解决它的错误工具。

正确的工具是switch,它正好用于处理“我想从列表中挑选一些东西”。编译器为您提供switch的各种支持,包括确保您不重复,并且您的检查是详尽的。但switch不适用于字符串。没关系。它只是意味着我们必须把我们的字符串变成一个枚举,这对于除了这个特别关注之外的各种事情都有好处。

最重要的是尽可能快地摆脱@"one",并将其转换为类型可检查的内容,例如OptionOne枚举案例。

typedef enum _Options {
    OptionUnknown = 0, // This one must be zero; rest don't matter
    OptionOne,
    OptionTwo,
    OptionThree
} Options;


NSDictionary *options = @{@"one": @(OptionOne),
                          @"two": @(OptionTwo),
                          @"three": @(OptionThree)
                         };

现在很容易做你想做的事:

    switch ([options[myString] intValue]) {
        case OptionUnknown:
            NSLog(@"I don't know that option");
            break;
        case OptionOne:
            NSLog(@"Thanks for option 1");
            break;
        default:
            NSLog(@"Meh; who cares about these options?");
            break;
    }

请注意,我在这里依赖于ObjC nil-messaging。如果options[x]不在字典中,则nilx。在类似整数的上下文中返回时,[nil intValue]为0。因此,通过使我们的“未知”案例为0,我们可以跳过很多繁琐且容易出错的检查,看看该值是否在字典中。