2014-07-08 15 views
13

Mam następujący przykład kodu C:const dla rozmiaru tablicy wyrażeń na argumencie

int f(const int farg[const 5]) 
{ 
} 

Jakie dodatkowe const dla rozmiaru tablicy zrobić? I jaka jest różnica, kiedy pomijam tam const?

+3

[prawdopodobnie związane] (http://stackoverflow.com/q/17559631/596781) –

+0

drugi "const" dał mi 4 błędy kompilatora – mch

+2

@mch upewnij się, że twój kompilator obsługuje C99 lub C11. (-std = c11 na przykład). clang 3.4 z -std = c11 zjada to bez problemu. – WhozCraig

Odpowiedz

13
int d(const int darg[5]) 

Środki darg jest wskaźnikiem do constint.

int e(int earg[const 5]) 

Środki earg jest const wskaźnik int. To jest funkcja c99. T A[qualifier-list e] jest równoważny jako T * qualifier-list A w deklaracji parametrów.

I oczywiście (od góry):

int f(const int farg[const 5]) 

Środki farg jest const wskaźnik constint.

1

Co robi dodatkowa stała dla rozmiaru tablicy?

C11: 6.7.6.3:

deklaracja parametru jako '' tablicy typu '' powinny być dostosowane do '' wykwalifikowanego wskaźnik do typu '', gdzie kwalifikatory typu (jeśli występują) są określone w [ i ] pochodnej typu tablicowego.

Oznacza to

int f(const int farg[const 5]) 

zostaną dostosowane do

int f(const int *const farg) 

A jaka jest różnica kiedy pominąć const tam?

Po pominięcia jest to równoważne

int f(const int frag[5]) //or int f(const int frag[]) 

co ostatecznie jest równoważne

int f(const int *farg) 
+3

'const int farg [const 5]' jest dostosowane do 'const int * const farg' nie do' const int const * farg'. – ouah

+0

@ouah; Oopa !. To był literówka. Powinien to być "kwalifikowany wskaźnik do typu" " – haccks