‘=’ должен инициализировать либо все члены enum, либо только первый;

Я пытаюсь построить свой код со следующими значениями перечисления:

typedef enum {
YUV_420P=0,
YUV_422P,
RGB_P,
BAYER_P,
YUV_422IBE,
YUV_444IBE,
A_1BIT,
YUV_420SP,
COMPLEX_8BIT,
COMPLEX_16BIT,
COMPLEX_32BIT,
COMPLEX_U8BIT,
COMPLEX_U16BIT,
COMPLEX_U32BIT,
ALPHA_TYPE=0x8000
} Format;

Но во время строительства я получаю следующее предупреждение.

sample.h: Note 960: Violates MISRA 2004 Required Rule 9.3, '=' should initialize either all enum members or only the first; enumerator: 'ALPHA_TYPE' ..

Я не хочу изменять значение ALPHA_TYPE, и я хочу поместить ALPHA_TYPE только в это перечисление. Как я могу решить это?

0

Решение

Ваш код уже делает то, что вы хотите. Вам просто нужно подавить это конкретное предупреждение.

С другой стороны, если вам абсолютно необходимо придерживаться этого правила 9.3 MISRA 2004, вам придется изменить свой код и найти другое решение. Но вы не можете иметь это в обоих направлениях.

4

Другие решения

Если значения других перечислений не имеют значения, вы можете сделать это

typedef enum {
ALPHA_TYPE=0x8000,
YUV_420P,
YUV_422P,
RGB_P,
BAYER_P,
YUV_422IBE,
YUV_444IBE,
1BIT,
YUV_420SP,
COMPLEX_8BIT,
COMPLEX_16BIT,
COMPLEX_32BIT,
COMPLEX_U8BIT,
COMPLEX_U16BIT,
COMPLEX_U32BIT
} Format;

Или же

Определите все значения перечисления, как это (это позволит избежать изменения одного из значений перечисления, если вы добавите новое)

  typedef enum {
YUV_420P=0,
YUV_422P=1,
RGB_P=2,
BAYER_P=3,
YUV_422IBE=4,
YUV_444IBE=5,
1BIT=6,
YUV_420SP=7,
COMPLEX_8BIT=8,
COMPLEX_16BIT=9,
COMPLEX_32BIT=10,
COMPLEX_U8BIT=11,
COMPLEX_U16BIT=12,
COMPLEX_U32BIT=13,
ALPHA_TYPE=0x8000
} Format;
2

Это, конечно, не требование C ++.

[C++11: 7.2/2]: переписчик-определение с = дает связанному перечислителю значение, указанное константа-выражение. Если первый перечислитель не имеет инициализатора, значение соответствующей константы равно нулю. переписчик-определение без инициализатора дает перечислителю значение, полученное путем увеличения значения предыдущего перечислителя
одним.

Грамматика над ней позволяет нескольким перечислителям иметь инициализатор.

Если вам разрешено, возможно, вы можете отключить проверки на соответствие этому правилу «MISRA 2004». Вы также можете просто проигнорировать это, так как это выглядит просто Note, Лично я был бы немного раздражен, чтобы это появлялось все время, но возможно это — только я.

1

Поскольку первое значение перечисления равно 0, и, поскольку оно также по умолчанию, просто используйте значение по умолчанию. ← Я неправильно понял предупреждение, этот пункт не является решением.

И / или отключите проверку правил MISRA.

И / или игнорировать конкретное примечание. Видимо, вы можете сделать это через +esym вариант. Или, может быть -esymПросто попробуйте вещи и проверьте документацию.

0
По вопросам рекламы [email protected]