2015-07-30 6 views
3

У меня есть следующий:Почему я должен использовать элемент перечисления при назначении ему одного и того же типа переменной перечисления в C?

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; 

    ... 
} 

Иннокентий мм, но при компиляции Мишра C выдает ошибку:

Значение выражения не должно быть отнесено к объекту с более узким эссенциальным типом или другая важное значение категории типа

И я узнал, что я буду писать инициализацию следующим образом:

ProgramStatus = (FLS_JobResult_t)FLS_PROG_SUCCESS; 

И это просто не выглядит хорошо для меня, это похоже на то, что MISRA хочет, чтобы я бросал броски во всем коде, и это слишком много.

Вы знаете, почему это так? Я не думаю, что это должно быть проблемой, но я пробовал все, что приходит мне на ум, и это был единственный способ избавиться от этой ошибки, но это просто не имеет никакого смысла, не так ли?

С уважением.

+0

Как @Veriloud предполагает, что это ошибка инструмента, а не нарушение кода – Andrew

ответ

6

(Привет, это новый счет, так что я не могу использовать раздел комментариев еще попросить дополнительные разъяснения, поэтому мой ответ может быть шире, чем это необходимо)

Основываясь на тексте предупреждающего сообщения я полагаю вы говорите о MISRA-C: 2012 (последний стандарт), который является большим улучшением по сравнению с предыдущими, в том, что было добавлено гораздо больше усилий, чтобы изложить обоснование вместе со многими более совместимыми и несоответствующими примерами. Это правило 10.3, обоснование таково: поскольку C разрешает присвоения между различными арифметическими типами, которые должны выполняться автоматически, использование этих неявных преобразований может привести к непредвиденным результатам с возможностью потери ценности, знака или точности.

Таким образом, MISRA-C: 2012 требует использования более сильного набора текста, как это предусмотрено его основной моделью типа, что уменьшает вероятность возникновения этих проблем.

К сожалению, многие инструменты неправильно реализовали правила и типовую модель. В этом случае ваш инструмент неверен, это не является нарушением правил основного типа, потому что ProgramStatus и FLS_PROG_SUCCESS являются одним и тем же основным типом. На самом деле подобный пример показан в самом стандарте, под списком из правила о совместимых примерах:

enum enuma { A1, A2, A3 } ena; 
ena = A1; 

Если поставщик инструмента не согласен Вы можете оставить свой вопрос на the "official" MISRA forum, чтобы получить официальный ответ и вперед, что поставщик ,

+0

Большое спасибо. Вот что я подумал, но я не был уверен. Поскольку я новичок в правилах MISRA-C, я подумал, что, возможно, что-то действительно не так. Также я думаю, что у моего инструмента есть проблемы с другими правилами, потому что мне сложно с такими вещами. Не могли бы вы взглянуть на его другой вопрос, я буду очень благодарен за это. http://stackoverflow.com/questions/31726911/misra-c-error-in-struct-array-initialization/31727527#31727527 – m4l490n

+1

Добро пожаловать. Наверное, я могу прокомментировать мой собственный ответ ;-), я посмотрел на другой вопрос и ответил. Разумеется, я спрашиваю, что это за инструмент? Поскольку правило 10.3 является широким правилом, инструмент должен более четко указать, какая часть правила, которое, по его мнению, нарушается. – Veriloud

+0

Инструмент «TriCore Eclipse IDE v5.0r2» – m4l490n

 Смежные вопросы

  • Нет связанных вопросов^_^