Разрешено ли подчеркивание в случае меток? - PullRequest
5 голосов
/ 10 февраля 2011

В некоторых заголовочных файлах, которые я не могу изменить, у меня есть следующий набор определений:

#define FLAG1                      (0x0000_0001)
#define FLAG2                      (0x0000_0002)
...

Затем в своем коде я использую их в switch:

switch (aaa) {
    case FLAG1:
    ....

    case FLAG2:
    ....
}

В результате Coverity сообщает о 2 дефектах на каждой этикетке:

RW.EXP_RPAREN: 
Event exp_rparen: expected a ")"

RW.CASE_LABEL_CONFLICT:
Event case_label_conflict: case label value has already appeared in 
this switch at line XX

Что не так с этими ярлыками дел? Это нарушает стандарты C?

Ответы [ 3 ]

5 голосов
/ 10 февраля 2011

Да, вам разрешено иметь круглые скобки. То, что вам не разрешено иметь , это число типа 0x0000_0001.

Это недопустимое шестнадцатеричное число, вам, вероятно, придется удалить символ _.

3 голосов
/ 10 февраля 2011

Да, это подчеркивание вызывает проблемы. FWIW, вот соответствующие разделы из стандарта языка C (черновик n1256 ):

  • & раздел; 6.4.4.1 Целочисленные константы: определяет структуру для целочисленных констант и показывает, что _ не является допустимым символом для целочисленной константы;
  • & раздел; 6.6 Выражения констант: определяет ограничения для константных выражений;
  • & раздел; 6.8.4.2 Оператор switch: определяет ограничения на метки case в операторе switch.
2 голосов
/ 10 февраля 2011

Он думает, что ожидает ), когда находит _, который недопустим в шестнадцатеричном формате.

Компилятор должен на самом деле жаловаться так:

error: invalid suffix "_0001" on integer constant

case метки могут содержать круглые скобки:

switch(number) {
    // no way to determine operator 
    // precedence without parens here
    case 2*(1+2):
}
...