Objective c 如何编写一个宏来检查重复的if?
我想写一个宏来检查宏之间的if语句是否唯一 宏之间的语句如下所示Objective c 如何编写一个宏来检查重复的if?,objective-c,macros,Objective C,Macros,我想写一个宏来检查宏之间的if语句是否唯一 宏之间的语句如下所示 if([myString isEqualToString:@"one"]){ //do something } if ([myString isEqualToString:@"two"]){ //do two somethings } 我想把我的ifs放在某个东西里,以确保我没有两个ifs在这个块中检查同一个东西 这可能吗 编辑 我希望我的宏执行以下操作 在对象o上启动宏 创建带有键“o”和值的字典 对于宏括号之间的每个if语句
if([myString isEqualToString:@"one"]){
//do something
}
if ([myString isEqualToString:@"two"]){
//do two somethings
}
我想把我的ifs放在某个东西里,以确保我没有两个ifs在这个块中检查同一个东西
这可能吗
编辑
我希望我的宏执行以下操作
在对象o上启动宏
创建带有键“o”和值的字典对于宏括号之间的每个if语句,都会在给定数组中检查“value”,如果它不在数组中,则将其推入,否则会给出一个#警告类型的宏,说明该值已经在数组中
结束宏并从内存中删除前面提到的字典。这是一个更重要的问题,即确保安全地处理类似字符串的比较。这个问题是好的,但是宏是完全错误的工具来修复它 正确的工具是
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消息传递<如果字典中没有
x
,则code>options[x]为nil
<代码>[nil intValue]在类似整数的上下文中返回时为0。因此,通过将“未知”情况设为0,我们可以跳过许多繁琐且容易出错的检查,以确定该值是否在字典中。这是可能的,但为什么要麻烦呢?宏的存在是为了消除繁琐,而不是增加复杂性。我需要它;),如果我不需要它,我就不会麻烦了我从来都不需要这样的东西,所以我想你也不需要。不管怎样,这是一个自由的世界。祝你好运。你能澄清一下你想要达到的目标吗?请用您试图阻止的内容的示例更新您的问题。@rmaddy请参阅编辑我需要对不可检查的值执行此操作,我无法将其转换为枚举,因为它不是那么简单。问题可能不可能解决(至少不需要尝试用宏预处理器创建一个完整的编译器,人们这样做是为了好玩,但它非常脆弱、复杂和缓慢)。为了找到一个可能的版本,您需要更好地构建您的问题。您所描述的不太适合宏。