我正在做一个大项目,在这个项目中我需要使用一个通用宏来从一个大负载中分配值。这些值可能是int、uint、bool或enum。所有其他宏都能正常工作,只是对于我需要帮助的enum。考虑一下这段代码,作为我想要实现的东西。
#include <stdio.h>
enum reasons { REASON1 = 1, REASON2 = 2, MAX_REASON = 3 };
#define SET_ENUM(dest, data) dest = data;
int main(void)
{
int a = 2;
enum reasons rs;
SET_ENUM(rs, a);
printf("REASON is -> %d\n", rs);
return 0;
}
在这里,它的工作一切正常,但在我的掩护运行它显示
事件混合枚举类型:枚举类型与另一类型混合
我想将数据类型转换到dest,但需要从宏中完成。有什么建议吗?
3条答案
按热度按时间mtb9vblg1#
您可以执行三参数SET_ENUM,指定类型:
或者对于某些编译器(gcc),您可以使用
typeof
关键字:typeof
关键字目前是一个非标准扩展,它似乎计划用于C23标准。bqjvbblv2#
预处理器将用
rs = a
替换SET_ENUM(rs, a)
。因此,您需要添加强制类型转换,以便将其替换为
rs = (reasons)a
。如果您只设置该枚举,则可以将宏定义为:
如果你想让它用于其他枚举,恐怕你必须将枚举作为参数添加到宏中:
然后这样称呼它:
kd3sttzy3#
由于枚举是简单的整数,而且基本上是一个***语法糖***,它们不做任何检查,如果值是正确的,你可以简单地做:
你所有的警告都会消失......