5

変更できない一部のヘッダー ファイルには、次の一連の定義があります。

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

次に、私のコードでは、それらをスイッチで使用します。

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

これは有効な 16 進数ではありません。おそらく_文字を削除する必要があります。

于 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

16 進表記で有効でない が)見つかった場合は、を期待していると思います。_

コンパイラは実際には次のように文句を言う必要があります。

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 に答える