W tym fragmencie, o wskaźnik do VLA służy do łatwiejszego dostępu do dużego tabeli przeglądowej:Obsada „wskaźnik do const” na „wskaźnik do const 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 dławiki na nim podczas Clang 4.0.0 (trunk) kompiluje się dobrze, zarówno z -Wcast-qual
włączone.
In function 'lookup':
warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
DATA_PTR data = (DATA_PTR)raw;
^
Kod działa zgodnie z oczekiwaniami w dowolny sposób.
Domyślam się GCC myli „wskaźnik do VLA elementów const” i „wskaźnik do const VLA”, ale sięgam ...
Czy jest jakiś sposób, żeby się zamknął GCC bez błahy z ostrzeżeń? Czy to jest błąd GCC?
Edit1:
Szczegóły dotyczące rzeczywistego kodu:
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:
Więc to jest ... C11 standardowy projekt mówi 6.7.3/9:
Jeśli szczególne Typ tablicy zawiera dowolne kwalifikatory typów, typ elementu jest kwalifikowany, a nie typ tablicy.
Zobacz odpowiedź @ hvd.
Jeden Hack uciszyć -Wcast-qual
:
DATA_PTR data = (DATA_PTR)(intptr_t)raw;
"Wskaźnik do VLA elementów const" i "wskaźnik do const VLA" to to samo. Tablica const jest tablicą elementów const. Wygląda jak błąd. – emlai
Dlaczego nie sprawić, aby cała sprawa była bardziej bezpieczna dla typu, i przekształcić 'raw' w' char const (* raw) [a] [b] [c] '? – StoryTeller
@StoryTeller Dodałem, jaki kod może wyglądać, ale nadal "-Wcast-qual" jest dziwne. – diapir