、VLAからポインタが大きなルックアップテーブルへのアクセスを容易にするために使用されます。キャストこのスニペットで「VLAをCONSTするポインタ」に「CONSTへのポインタ」
#pragma GCC diagnostic warning "-Wcast-qual"
char
lookup(int a, int b, int c, char const *raw, int x, int y, int z)
{
typedef char const (*DATA_PTR)[a][b][c];
DATA_PTR data = (DATA_PTR)raw;
return (*data)[x][y][z];
}
GCC 6.2.0チョークしている間クラング4.0.0(トランク)は両方とも-Wcast-qual
が有効になっていればうまくコンパイルされます。
In function 'lookup':
warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
DATA_PTR data = (DATA_PTR)raw;
^
期待どおりにコードが実行されます。
私の推測では、GCCは「constの要素のVLAへのポインタ」と「VLAをCONSTへのポインタを」混乱が、私は到達しています...
が警告をいじることなく、GCCを遮断するが方法はありますか? これはGCCのバグですか?
EDIT1:実際のコード上の
詳細:
struct table {
int a;
int b;
int c;
char *raw;
};
char
lookup2(struct table const *table, int x, int y, int z)
{
typedef char const(*DATA_PTR)[table->a][table->b][table->c];
DATA_PTR data;
data = (DATA_PTR)table->raw; // GCC ok
data = (DATA_PTR)(char const *)table->raw; // GCC raises -Wcast-qual
return (*data)[x][y][z];
}
EDIT2:
だからそれは... C11標準草案は/ 6.7.3で述べています9:
配列型の型には任意の型修飾子が含まれますが、要素型は配列型ではなく、修飾されています。
@hvd answerを参照してください。 -Wcast-qual
を黙らせる
一つハック:
DATA_PTR data = (DATA_PTR)(intptr_t)raw;
"const要素のVLAへのポインタ"と "const VLAへのポインタ"は同じものです。 const配列はconst要素の配列です。バグみたいです – emlai
全体をもう少し型安全にし、 'raw'を' 'char const(* raw)[a] [b] [c]'にするのはなぜでしょうか? – StoryTeller
@StoryTellerコードがどのように見えるかを追加しましたが、それでも '-Wcast-qual'は変です。 – diapir