На вопрос:Почему анонимное перечисление не удалось выполнить правило MISRA C 2012 10.3, а имя enum - нет?
Why do I have to cast an enum element when assigning it to a same enum variable type in C?
У меня были проблемы с этим кодом для проваливать MISRA C 2012 правило 10,3, который гласит:
Значение выражения не должно быть присвоенный объекту с более узким существенным типом или другой категорией существенного типа
Код это:
typedef enum
{
FLS_PROG_SUCCESS,
FLS_PROG_FAIL,
FLS_ERASE_SUCCESS2U,
FLS_ERASE_FAIL,
FLS_READ_SUCCESS,
FLS_READ_FAIL,
FLS_FORMAT_SUCCESS,
FLS_FORMAT_FAIL
}FLS_JobResult_t;
void Foo(void)
{
FLS_JobResult_t ProgramStatus;
/* Then I try to initialize the variable value */
ProgramStatus = FLS_PROG_SUCCESS;
...
}
И я принял ответ, что предположить, что этот инструмент может быть испорчен. Я до сих пор считаю, что, но дурачиться, пытаясь исправить, что я поставил имени к перечислениям декларации ЬурейиХ, которая в настоящее время является:
typedef enum FLS_JobResult_tag
{
FLS_PROG_SUCCESS,
FLS_PROG_FAIL,
FLS_ERASE_SUCCESS2U,
FLS_ERASE_FAIL,
FLS_READ_SUCCESS,
FLS_READ_FAIL,
FLS_FORMAT_SUCCESS,
FLS_FORMAT_FAIL
}FLS_JobResult_t;
И насколько я знаю, как это точно так же. Но тогда, сюрприз! Ошибка исчезла! Контроллер правил больше не отмечает, что это ошибка!
Затем делать некоторые исследования я нашел эти два вопроса:
What are the differences between these two typedef styles in C?
и
What's the difference between these two enum declarations - C?
И я понял, что есть тонкие различия между анонимного перечисления и named enum. Но ничего не дает понять, что может быть причиной того, что контролер правил жалуется на одну форму другого.
Вопрос в следующем: В чем разница между анонимным enum и enum, который может нарушить правило 10.3 от MISRA c 2012?
это не должно относиться к стандарту C, определенному ISO. он должен быть определен в указанном стандарте. – HuStmpHrrr
Посмотрите определение MISRA «основного типа». Это отличается от фактического типа выражения в C. –
Просто наблюдение: отладчики (по крайней мере, несколько, которые я использовал) имеют ту же проблему с именованными и неназванными структурами. Кажется, что внутренне * тип * объекта определяется тегом структуры или тегом enum, а typedef - просто псевдоним, используемый компилятором, но не отладчиком или контролером правил. – user3386109