如何检查宏参数中是否有赋值?

时间:2015-05-16 08:27:26

标签: c++ c string enums macros

我们如何检查宏参数中是否有分配,如下例所示?

定义:

#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。

2 个答案:

答案 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,不能编译。

相关问题