【发布时间】:2015-05-16 08:27:26
【问题描述】:
我们如何检查宏参数中是否有赋值,如下例所示?
定义:
#define value(x) {...}
呼叫:
case a: value( a = 10 )
case b: value( 10 )
我想要做的是通过以下方式实现一个字符串枚举:
#define STR_ENUM_DICT_ITEM_(value) [@((MethodX value)) stringValue]:@#value,
#define STR_ENUM_DICT_ITEM(idx, value) STR_ENUM_DICT_ITEM_(value)
#define STR_ENUM(type, name, ...) \
typedef NS_ENUM (type, name){__VA_ARGS__}; \
NSString *name##_S(type value) \
{ \
static NSDictionary *values; \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
values = @{ \
metamacro_foreach(STR_ENUM_DICT_ITEM, , __VA_ARGS__) \
}; \
}); \
return [values valueForKey:[@(value)stringValue]]; \
}
STR_ENUM(NSUInteger, MethodX,
Method1 = 100// this is comment
, Method2
, Method3 = Method1
);
所以我需要检查参数中是否有赋值,或者其他方式 可以得到(Method1 = 100)或者(Method3 = Method1)的值,结果是100, 100。
【问题讨论】:
-
由于预处理器只做简单的文本替换,你不能做太多检查扩展参数。
-
吹毛求疵:没有叫马科斯。
-
大概你的意思是在编译时检查,而不是在运行时检查?
-
为什么是
enums标签,顺便说一句? -
为什么人们更喜欢宏?编译器更好,因为它有更多信息