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
相关产品推荐
相关产品推荐

