5

在一些我无法修改的头文件中,我有以下一组定义:

#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 标准?

4

3 回答 3

5

是的,你可以有括号。你不允许拥有的是一个像0x0000_0001.

这不是一个有效的十六进制数字,您可能必须删除该_字符。

于 2011-02-10T13:52:14.627 回答
3

是的,这是导致问题的下划线。FWIW,以下是 C 语言标准(草案n1256)的相关部分:

  • § 6.4.4.1 整数常量:定义整数常量的结构,并表明它_不是整数常量的有效字符;
  • § 6.6 常量表达式:定义常量表达式的限制;
  • § 6.8.4.2语句:定义语句中标签switch的限制。caseswitch
于 2011-02-10T15:16:37.080 回答
2

它认为它期望)当它发现_在十六进制表示法中无效的 。

编译器实际上应该这样抱怨:

error: invalid suffix "_0001" on integer constant

case标签很可能包含括号:

switch(number) {
    // no way to determine operator 
    // precedence without parens here
    case 2*(1+2):
}
于 2011-02-10T13:51:37.187 回答