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

How can I check if there is an assignment in a macro's parameter?

本文关键字:参数 是否 赋值 何检查 检查      更新时间:2023-10-16

如何检查宏参数中是否有赋值,如下例所示?

定义:

#define value(x) {...}

调用:

case a: value( a = 10 )
case b: value( 10 )

我想做的是用下面的方式实现一个string enum:

#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

在性能方面不是很有效,但它可以工作:

#define value(x) 
  do { 
    assert(!strchr(#x, '=')); 
    /* rest of macro */ 
  } while (0)

这是一个简单的例子,只涵盖了op提供的两种情况。然而,使用#运算符将宏的参数转换为"字符串",可以创建任意复杂的规则来测试。

您是否可以更详细地指定要区分哪些情况?

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外的所有宏都编译。后者变成a=10==a=10,不编译