You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C代码转C++编译时枚举类型转换错误的修正咨询

解决C代码在C++编译时的枚举类型转换错误

报错信息

编译时触发以下错误:

[Error] JAMEXP.C@221,31: invalid conversion from 'int' to 'OPERATOR_TYPE' [-fpermissive]
[Error] JAMEXP.C@221,33: invalid conversion from 'int' to 'JAME_EXPRESSION_TYPE' [-fpermissive]

问题代码片段

/* types of expressions */
typedef enum
{
    JAM_ILLEGAL_EXPR_TYPE = 0,
    JAM_INTEGER_EXPR,
    JAM_BOOLEAN_EXPR,
    JAM_INT_OR_BOOL_EXPR,
    JAM_ARRAY_REFERENCE,
    JAM_EXPR_MAX

} JAME_EXPRESSION_TYPE;

enum OPERATOR_TYPE
{
    ADD = 0,
    SUB,
    UMINUS,
    MULT,
    DIV,
    MOD,
    NOT,
    AND,
    OR,
    BITWISE_NOT,
    BITWISE_AND,
    BITWISE_OR,
    BITWISE_XOR,
    LEFT_SHIFT,
    RIGHT_SHIFT,
    DOT_DOT,
    EQUALITY,
    INEQUALITY,
    GREATER_THAN,
    LESS_THAN,
    GREATER_OR_EQUAL,
    LESS_OR_EQUAL,
    ABS,
    INT,
    LOG2,
    SQRT,
    CIEL,
    FLOOR,
    ARRAY,
    POUND,
    DOLLAR,
    ARRAY_RANGE,
    ARRAY_ALL
};

typedef enum OPERATOR_TYPE OPERATOR_TYPE;

typedef struct EXP_STACK
{
  OPERATOR_TYPE     child_otype;
  JAME_EXPRESSION_TYPE type;
  long              val;
  long              loper;      /* left and right operands for DIV */
  long              roper;      /* we save it for CEIL/FLOOR's use */
} EXPN_STACK;

#define YYSTYPE EXPN_STACK      /* must be a #define for yacc */

YYSTYPE jam_null_expression = {0,0,0,0,0};//line 221

解决方案

C++对枚举类型的类型检查远严格于C,不允许直接将int值隐式转换为枚举类型,可通过以下两种方式修复:

方法1:显式强制类型转换

把初始化列表中的0强制转换为对应的枚举类型:

YYSTYPE jam_null_expression = {(OPERATOR_TYPE)0, (JAME_EXPRESSION_TYPE)0, 0, 0, 0};

方法2:使用枚举自身的常量初始化

两个枚举的第一个常量值都是0,直接用枚举常量赋值更符合语义,可读性更强:

YYSTYPE jam_null_expression = {ADD, JAM_ILLEGAL_EXPR_TYPE, 0, 0, 0};

两种方法都能通过C++的类型检查,推荐第二种,它避免了魔法数字,更清晰地表达代码意图。

内容的提问来源于stack exchange,提问作者Tery123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:25:44