指向枚举数组的引用/指针未获得正确的值

问题描述 投票:0回答:1

我有一个枚举数组:

typedef enum {
    Item0,
    Item1,
    Item2
} ITEMS_TYPE;

ITEMS_TYPE MyItemsArray[] = {
    Item0,
    Item1,
    Item2
};

bool findIndexOfItemInArray(int32_t valueToFind, int32_t* arrayToScan, int32_t arrayLastIndex, int32_t* indexOfTheSearchedValue)
{
    int32_t index;
    int32_t value;

    for(index = 0; index < arrayLastIndex; index++)
    {
        //value = static_cast<int32_t>(arrayToScan[index]); //this when C++
        value = (int32_t)(arrayToScan[index]); //this when C
        if(value == valueToFind)
        {
            *indexOfTheSearchedValue = index;
            return true;
        }
    }
    return false;
}

int main(void)
{
    int32_t valueToFind = 0;
    int32_t itemIndex;

    findIndexOfItemInArray((int32_t)valueToFind, (int32_t*)MyItemsArray, Item2, &itemIndex));
}

我的问题是

arrayToScan[index];

findIndexOfItemInArray()
函数内部从来不是给定项目的整数值,而是一些奇怪的长数字。

当我用 C 编译它时,一切都有效,但在 C++ 中则不行。我错过了什么?

c++ arrays pointers enums casting
1个回答
0
投票

来自 c++17 std 草案 [dcl.enum] 10.2.7.

对于底层类型不固定的枚举,底层类型是整型,可以 表示枚举中定义的所有枚举值。如果没有一个整型可以代表所有 枚举器值,枚举格式错误。 它是实现定义的使用哪种整型 作为基础类型,但基础类型不得大于 int,除非 an 的值 枚举数不能容纳 int 或 unsigned int。如果枚举器列表为空,则基础类型为 如果枚举有一个值为 0 的枚举器

因此,通过将指针强制转换和取消引用到可能不同的类型,例如,您在这里会导致未定义的行为。

std::int32_t
vs
std::uint32_t
。例如 gcc 13 使用无符号整数作为枚举的基础类型。

不要在需要整数算术的上下文中使用枚举。您可以例如将

std::vector<ITEMS_TYPE>
传递给您的函数,并使用
Item0
而不是字面整数 0 进行查找。

© www.soinside.com 2019 - 2024. All rights reserved.