Enum

Enum 是一種用文字代替數字 state 的方式。

enum OdomMode {
    MOTOR_IMU = 0,            
    MOTOR_FRONTTW_IMU = 1,    
    LEFTTW_FRONTTW_IMU = 2,   
    RIGHTTW_FRONTTW_IMU = 3, 
    MOTOR_BACKTW_IMU = 4,     
    LEFTTW_BACKTW_IMU = 5,   
    RIGHTTW_BACKTW_IMU = 6,  
    MIDDLETW_IMU = 7,         
};

也可以省略等號

// equivalent to the code above
enum OdomMode {
    MOTOR_IMU,            
    MOTOR_FRONTTW_IMU,    
    LEFTTW_FRONTTW_IMU,   
    RIGHTTW_FRONTTW_IMU, 
    MOTOR_BACKTW_IMU,     
    LEFTTW_BACKTW_IMU,   
    RIGHTTW_BACKTW_IMU,  
    MIDDLETW_IMU,         
};
OdomMode get_mode() {
    return MOTOR_IMU;
}

int main() {
    if (get_mode() == OdomMode::MOTOR_IMU) {
        printf("Motor imu mode\n");
    }
    return 0;
}

安全問題

以下會顯示:「Motor imu mode equals to apple」

#include <iostream>
 
// equivalent to the code above
enum OdomMode {
    MOTOR_IMU,            
    MOTOR_FRONTTW_IMU,    
    LEFTTW_FRONTTW_IMU,   
    RIGHTTW_FRONTTW_IMU, 
    MOTOR_BACKTW_IMU,     
    LEFTTW_BACKTW_IMU,   
    RIGHTTW_BACKTW_IMU,  
    MIDDLETW_IMU,         
};

enum Fruit {
    APPLE,
    BANANA,
};

int main() {
    OdomMode mode = MOTOR_IMU;
    Fruit fruit = APPLE;
    if (mode == fruit) {
        printf("Motor imu mode equals to apple\n");
    }
    return 0;
}

解決方式:Enum class

使用 Enum class 可以有效解決 Enum 混用的問題

#include <iostream>
 
// equivalent to the code above
enum class OdomMode {
    MOTOR_IMU,            
    MOTOR_FRONTTW_IMU,    
    LEFTTW_FRONTTW_IMU,   
    RIGHTTW_FRONTTW_IMU, 
    MOTOR_BACKTW_IMU,     
    LEFTTW_BACKTW_IMU,   
    RIGHTTW_BACKTW_IMU,  
    MIDDLETW_IMU,         
};

enum class Fruit {
    APPLE,
    BANANA,
};


int main() {
    OdomMode mode = OdomMode::MOTOR_IMU;
    Fruit fruit = Fruit::APPLE;
    if (mode == fruit) { // throws error
        printf("Motor imu mode equals to apple\n");
    }
    return 0;
}

Last updated