【发布时间】:2017-05-15 03:31:31
【问题描述】:
在这个 sn-p 中,指向 VLA 的指针用于更轻松地访问大型查找表:
#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 阻塞,而 Clang 4.0.0(trunk) 编译得很好,都启用了-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 的指针”和“指向 const VLA 的指针”,但我正在达到...
有没有办法让 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 答案。
让-Wcast-qual 静音的一个技巧:
DATA_PTR data = (DATA_PTR)(intptr_t)raw;
【问题讨论】:
-
“指向 const 元素的 VLA 的指针”和“指向 const VLA 的指针”是一回事。 const 数组是 const 元素的数组。看起来像一个错误。
-
为什么不让整个事情更安全一点,把
raw变成char const (*raw)[a][b][c]? -
@StoryTeller 我添加了代码的样子,但
-Wcast-qual仍然很奇怪。 -
@StoryTeller 这是一种解脱,谢谢。随时添加您的评论作为答案,以便我可以关闭问题。干杯!
-
@diapir - 在 GCC 6.3 中也没有修复。显然
-Wall -Wextra -pedantic没有打开-Wcast-qual(叹气)
标签: c pointers constants c99 variable-length-array