案例标签是否允许下划线?

时间:2011-02-10 13:45:57

标签: c coding-style coverity-prevent

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

#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 个答案:

答案 0 :(得分:5)

是的,你可以有括号。您不允许的内容是0x0000_0001

之类的数字

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

答案 1 :(得分:3)

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

  • §6.4.4.1整数常量:定义整数常量的结构,并显示_不是整数常量的有效字符;
  • §6.6常量表达式:定义对常量表达式的限制;
  • §6.8.4.2switch语句:定义case语句中switch标签的限制。

答案 2 :(得分:2)

它认为)在找到以十六进制表示法无效的_时会发现它。

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

error: invalid suffix "_0001" on integer constant

case标签可能包含括号:

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