我们如何检查宏参数中是否有分配,如下例所示?
定义:
#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
);
所以我需要检查param中是否有分配或其他方式 可以得到(Method1 = 100)或(Method3 = Method1)的值,结果是100,100。
答案 0 :(得分:2)
在性能方面效率不高但有效:
#define value(x) \
do { \
assert(!strchr(#x, '=')); \
/* rest of macro */ \
} while (0)
这是一个简单的例子,仅涵盖OP提供的两种情况。但是,使用#
运算符将宏的参数转换为“字符串”,可以创建复杂的规则来进行测试。
答案 1 :(得分:2)
您能否详细说明您要区分哪些案例? <怎么样
.menu-animated {
-webkit-transition-duration: 1500ms;
-moz-transition-duration: 1500ms;
transition-duration: 1500ms;
}
如果包含作业,您希望发生什么?编译错误或其他什么?
对于编译错误,我设法完成了以下工作
value(a)
value(a+2)
value(a==10)
value(a<=10)
value('=')
除#define check(a) if (a==a);
int main() {
int a;
check(10);
check(a);
check(a+2);
check(a==10);
check(a<=10);
check('=');
check(a=10);
return 0;
}
之外的每个宏都会编译。后者变成a=10
,不能编译。