通过以下方式将枚举定义为标志

    typedef enum
    {
        NOT_PID = 0,
        PID1 = (1U << 0),
        PID2 = (1U << 1),
        NUM_PID = 3

    } pid_t;

    float m_derivative[pid_t::NUM_PID];

并如下使用它:
    m_derivative[pid_t::PID1] = 4.0
    m_derivative[pid_t::PID2] = 3.0

优良作法是以这种方式将移位的无符号数字用作数组的索引号吗?

最佳答案

如果再走一步会怎样?

typedef enum
{
    NOT_PID = 0,
    PID1 = (1U << 0),
    PID2 = (1U << 1),
    PID3 = (1U << 2),
    NUM_PID = 4
} pid_t;

float m_derivative[pid_t::NUM_PID];
m_derivative[pid_t::PID3] = 4.0; // out of bounds

在此,PID3 = 4不小于NUM_PID。这将导致超出范围的访问。

如果将NUM_PID定义为足够大,则顾名思义,它不再是PID的数量。此外,如果您具有相对大量的PID,那么您将浪费大量内存。例如,对于20个PID,您需要一个2 ^ 20 = 1048576个元素的数组,如果使用32位枚举器,则为4MB。

如果您确实需要在某处使用两个的幂,请在需要它们时将它们生成:
enum pid_t { NOT_PID, PID1, PID2, PID3, NUM_PID };
auto pid_bit(pid_t pid) -> unsigned int {
    if (pid == NOT_PID) {
        return 0;
    }
    return 1u << (pid-1);
}

还要注意,在C++中,您无需键入枚举。

09-06 22:14