В этом фрагменте указателя на VLA используется для облегчения доступа к большой справочной таблице:Cast «указатель на константный» в «указатель на константные 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 (багажник) компилируется просто отлично, оба с -Wcast-qual
включены.
In function 'lookup':
warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
DATA_PTR data = (DATA_PTR)raw;
^
Код работает как ожидалось в любом случае.
Моя догадка НКУ путает «указатель на VLA из константных элементов» и «указатель на константные 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;
«указатель на VLA элементов const» и «указатель на const VLA» - это одно и то же. Массив const представляет собой массив элементов const. Похоже на ошибку. – emlai
Почему бы не сделать все это более безопасным с типом и сделать 'raw' в' char const (* raw) [a] [b] [c] '? – StoryTeller
@StoryTeller Я добавил, как выглядит код, но тем не менее, что '-Wcast-qual' странно. – diapir