如何将enum传入带switch case的函数?解决编译报错问题
解决枚举类型作为函数参数的编译错误
错误原因
你当前的枚举声明enum{TOP, BOTTOM}motorGroup;是定义了一个匿名枚举类型,同时创建了一个名为motorGroup的变量,而非将motorGroup定义为枚举类型名。所以在函数参数里写motorGroup group时,编译器会把motorGroup当成变量,导致语法错误。
修复方案
有两种标准写法可以正确定义枚举类型,让函数参数和switch-case正常工作:
方案1:使用typedef定义枚举类型别名
直接把motorGroup定义成枚举类型的别名,函数参数可直接用motorGroup作为类型,写法更简洁:
typedef enum {TOP, BOTTOM} motorGroup; long pulses; int ppi = 0; int dist = 0; int speed; void pulseCount() { pulses++; dist = pulses / ppi; } void systemInit() { pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); attachInterrupt(digitalPinToInterrupt(2), pulseCount, RISING); } void actuatorPush(motorGroup group, int speed) { switch(group) { case TOP: analogWrite(4, speed); analogWrite(5, 0); analogWrite(6, speed); analogWrite(7, 0); break; case BOTTOM: analogWrite(8, speed); analogWrite(9, 0); analogWrite(10, speed); analogWrite(11, 0); break; } } void actuatorPull(motorGroup group, int speed) { switch(group) { case TOP: analogWrite(4, 0); analogWrite(5, speed); analogWrite(6, 0); analogWrite(7, speed); break; case BOTTOM: analogWrite(8, 0); analogWrite(9, speed); analogWrite(10, 0); analogWrite(11, speed); break; } }
方案2:显式命名枚举类型
先定义带名字的枚举类型,函数参数中使用enum motorGroup作为类型:
enum motorGroup {TOP, BOTTOM}; long pulses; int ppi = 0; int dist = 0; int speed; // 后续函数参数需修改为: void actuatorPush(enum motorGroup group, int speed) // actuatorPull函数参数做同样修改
说明
两种方案都能让编译器正确识别group是枚举类型参数,switch-case也能正常解析TOP和BOTTOM枚举值。
内容的提问来源于stack exchange,提问作者RGB Engineer
相关产品推荐
相关产品推荐

