如何检查宏的参数中是否有赋值?
How can I check if there is an assignment in a macro's parameter?
如何检查宏参数中是否有赋值,如下例所示?
定义:
#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
,不编译
相关文章:
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 如何检查给定的参数是否为 cv::noArray()?
- 如果返回 -1,时间() 的参数是否被修改?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 检查两个模板参数是否相同
- 空函数的参数是否加载到缓存中?
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 了解'this'或其他参数是否为右值
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- shared_ptr构造函数参数是否应按值传递
- 如何检查模板参数是否为给定值?
- 使用聚合初始化模拟默认函数参数是否存在任何陷阱?
- 在对象序列化期间添加额外参数是否有更好的方法?
- 通过 ssh 发送参数.是否有非阻塞输入函数?
- 如何检查运算符 != 模板参数是否存在 C++ 17?
- 常量引用函数参数:是否可以禁止临时对象?
- 如何检查模板参数是否为 std::variant?
- 是否可以确定函数的参数是否已签名或无符号,以实现可能性超载函数
- 移动 l 值参考参数是否是一种不好的做法?
- 显式指定通用 lambda 的 operator() 模板参数是否合法?