2013-07-09 26 views
27

Najwyraźniej następujące prototypy funkcji obowiązują w C99 i C11:Jakie są te dziwne rozmiary tablic [*] i [statyczne] w C99?

void foo(int a[const *]); 

void bar(int a[static volatile 10]); 

Jaki jest cel tych dziwnych indeksu dolnego zapisów *, static i kwalifikatorów CV?

Czy pomagają odróżnić tablice statycznie typowane od tablic o zmiennej długości? A może to tylko cukier syntaktyczny?

+0

statyczny: http://stackoverflow.com/questions/3430315/purpose-of-static-keyword-in-array-parameter-of-function –

+0

gwiazdka: http://stackoverflow.com/questions/17371645/parameter -of-a-funkcja –

Odpowiedz

21

statyczny parametr tablicy declarator

void f(int a[static 10]); 

static tutaj jest wskazanie, że parametr a jest wskaźnikiem int ale że objet tablicy (gdzie a jest wskaźnikiem jej pierwszego elementu) ma co najmniej 10 elementów.

Kompilator ma wtedy prawo przyjąć, że argument f nie jest NULL i dlatego może wykonywać pewne optymalizacje. gcc aktualnie nie wykonuje żadnej Optimization (source): „Informacje dostarczane przez statyczny w parametrze declarators tablica nie jest używany do optymalizacji może warto byłoby wykorzystać go w przyszłości w związku z pracami nad prefetching.”

sklasyfikowany w tablicy parametrów declarator

void g(int a[cvr 10]); 

wewnątrz ga jest CVR wskaźnik int (CVR jest const, volatile lub restrict kwalifikacyjnych). Na przykład, z const oznacza to, że a jest wskaźnikiem const (tj., Typem (tj. Typem int * const).

Więc oświadczenie parametr:

T param[cvr e] 

jest taka sama jak w deklaracji parametru:

T * cvr param 

*parametru tablica declarator

void h(int a[*]); 

[*] w formalnej deklaracji parametru tablicy w deklaracji funkcji (która nie jest częścią definicji funkcji) wskazuje, że formalna tablica jest tablicą o zmiennej długości.

+2

Jak to jest przydatne? Wydaje mi się, że nie otrzymuję * żadnej * sensownej diagnostyki, gdy wywołuję funkcje z niewłaściwym typem tablicy (nieprawidłowy rozmiar lub niewłaściwa VLA).Czy otrzymujesz obsługę 'sizeof' dla' [*] '? –

+0

@KerrekSB C nie wymaga diagnostyki i domyślam się, że kompilatory nie ostrzegają, ponieważ ta funkcja jest tak rzadko używana. – ouah

+0

@KerrekSB dla 'sizeof' z' int (*) [*] 'na przykład z' gcc' otrzymuję * '[\ *]' niedozwolone w zakresie innym niż prototypowy zakres funkcji * – ouah