c# 在C语言中使用宏将整数赋给枚举

mzmfm0qo  于 2023-03-16  发布在  C#
关注(0)|答案(3)|浏览(267)

我正在做一个大项目,在这个项目中我需要使用一个通用宏来从一个大负载中分配值。这些值可能是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,但需要从宏中完成。有什么建议吗?

mtb9vblg

mtb9vblg1#

您可以执行三参数SET_ENUM,指定类型:

#define SET_ENUM(dest, type, data) dest = (enum type) data
...
SET_ENUM(rs, reasons, a);

或者对于某些编译器(gcc),您可以使用typeof关键字:

#define SET_ENUM(dest, data) dest = (typeof(dest)) data
...
SET_ENUM(rs, a);

typeof关键字目前是一个非标准扩展,它似乎计划用于C23标准。

bqjvbblv

bqjvbblv2#

预处理器将用rs = a替换SET_ENUM(rs, a)
因此,您需要添加强制类型转换,以便将其替换为rs = (reasons)a
如果您只设置该枚举,则可以将宏定义为:

#define SET_ENUM(dest, data) dest = (reasons)data;

如果你想让它用于其他枚举,恐怕你必须将枚举作为参数添加到宏中:

#define SET_ENUM(dest, data, T) dest = (T)data;

然后这样称呼它:

SET_ENUM(rs, a, reason);
kd3sttzy

kd3sttzy3#

由于枚举是简单的整数,而且基本上是一个***语法糖***,它们不做任何检查,如果值是正确的,你可以简单地做:

#define SET_ENUM(dest, data) do{((int)(dest)) = ((int)(data));}while(0)

你所有的警告都会消失......

相关问题