gpt4 book ai didi

当枚举和标识符列表的长度不匹配时导致编译器错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:02:03 25 4
gpt4 key购买 nike

我们的系统中有一个枚举,如下所示:

enum EventCode {
BAD_CONFIG = 0,
BAD_NET = 1,
...
BAD_UNKNOWN = 92,
// This should always be at the end, and the numbers in
// this list should be continuous!
EVENT_LIST_LENGTH
}

以及对应的事件模式标识符列表:

int eventModeType[] = {
INT32,
...
INT16 // List position 92.
}

在某些时候添加了:

enum EventCode {
...
BAD_UNKNOWN = 92,
NEW_ERROR = 100,
// This should always be at the end, and the numbers in
// this list should be continuous!
EVENT_LIST_LENGTH
}

即使相应的模式被添加到eventModeType ,这一行显然导致了未定义的行为:

// Oh no, EVENT_LIST_LENGTH is too large!!!
for (unsigned int i = 0; i < EVENT_LIST_LENGTH; ++i) {
printf("Error code %d | %d\n", i, eventModeType[i]);
}

我如何在 EVENT_LIST_LENGTH 时导致编译器错误?和 eventModeType 的长度不匹配,所以没有人会犯这个错误?

最佳答案

我找到的一个解决方案是这样做:

// macro to stop warning from unused variable.
#define _unused(x) ((void)x)

// Actual size of list.
const int EVENT_MODE_LIST_LENGTH = sizeof(eventModeType) / sizeof(eventModeType[0]);

// With -Werror turned on, the following function will produce the error:
// error : size of array 'arr' is too large
// in the event that EVENT_LIST_LENGTH is larger then EVENT_MODE_LIST_LENGTH
void evantModeArraySizeChecker(void)
{
int arr[EVENT_LIST_LENGTH - EVENT_MODE_LIST_LENGTH + 1];
_unused(arr);
int arr2[EVENT_MODE_LIST_LENGTH - EVENT_LIST_LENGTH + 1];
_unused(arr2);
}

如果这个列表被错误地修改,这将导致编译器错误。

关于当枚举和标识符列表的长度不匹配时导致编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39171636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com