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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:05:24