在一些我无法修改的头文件中,我有以下一组定义:
#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标准吗?
答案 0 :(得分:5)
是的,你可以有括号。您不允许的内容是0x0000_0001
。
这不是有效的十六进制数字,您可能必须删除_
字符。
答案 1 :(得分:3)
是的,这是引起问题的下划线。 FWIW,以下是C语言标准(草案n1256)的相关部分:
_
不是整数常量的有效字符; switch
语句:定义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):
}