我有一个枚举数组:
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++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 进行查找。