Citirea declaratiilor complexe in limbajul C
Cum citim o declaratie complexa intr-un program C ?
De exemplu, ce inseamna:
- char*(*(*(* const myVar[2])(int))[4])(int)
?
Utilizarea unor declaratii complexe ar trebui evitata (ar trebui folosite typedef-uri).
Nu folositi declaratii complexe in cadrul propriilor programe.
Totusi, putem intalni astfel de declaratii in codul existent al unui program ... De asemenea, pot aparea in cazul intrebarilor din cadrul unui interviu.
O metoda de a interpreta astfel de declaratii este urmatoarea:
1. Se porneste de la numele variabilei
2. Se citeste catre dreapta pana cand se intalneste o paranteza ) sau pana cand se termina expresia
3. Se citeste catre stanga pana cand se intalneste o paranteza ( sau pana cand se ajunge la inceputul expresiei
4. Daca suntem in interiorul unui set de paranteze, se merge cu un nivel mai sus si se repeta pasii 2 si 3
Folosind "algoritmul" de mai sus, declaratia complexa poate fi "decodificata" in mod progresiv.
Sa aplicam aceste reguli in cazul exemplului de mai sus:
1. Se porneste de la numele variabilei, care este myVar
2. Citim spre dreapta pana cand ajungem la o paranteza )
Avem:
myVar[2]
Adica:
myVar este un array de doi
3. Citim spre stanga pana cand ajungem la o paranteza (
Avem:
* const
Adica:
myVar este un array de doi pointeri constanti
4. Mergem cu un nivel mai sus
Avem:
(*(* const myVar[2])(int))
5. Citim catre dreapta
Avem:
(int)
Adica:
myVar este un array de doi pointeri constanti catre o functie care primeste un parametru de tip intreg
6. Citim catre stanga, pana cand intlnim o paranteza (
Avem:
*
Adica:
myVar este un array de doi pointeri constanti catre o functie care primeste un parametru de tip intreg si intoarce un pointer
7. Mergem cu un nivel mai sus
Avem:
(*(*(* const myVar[2])(int))[4])
8. Mergem catre dreapta pana inalnim o paranteza )
Avem:
[4]
Adica:
myVar este un array de doi pointeri constanti catre o functie care primeste un parametru de tip intreg si intoarce un pointer catre un array de patru
9. Citim catre stanga pana cand ajungem la o paranteza (
Avem:
*
Adica:
myVar este un array de doi pointeri constanti catre o functie care primeste un parametru de tip intreg si intoarce un pointer catre un array de patru pointeri
10. Mergem cu un nivel mai sus
Avem:
char*(*(*(* const myVar[2])(int))[4])(int)
11. Citim catre dreapta
Avem:
(int)
Adica:
myVar este un array de doi pointeri constanti catre o functie care nu primeste un parametru de tip intreg si intoarce un pointer catre un array de patru pointeri catre o functie ce primeste un parametru de tip intreg
12. Citim catre stanga
Avem:
char*
Adica:
myVar este un array de doi pointeri constanti catre o functie care primeste un parametru de tip intreg si intoarce un pointer catre un array de patru pointeri catre o functie ce primeste un parametru de tip intreg si intoarce un pointer la caracter
13. END
In concluzie:
myVar este un array de doi pointeri constanti catre o functie care primeste un parametru de tip intreg si intoarce un pointer catre un array de patru pointeri catre o functie ce primeste un parametru de tip intreg si intoarce un pointer la caracter
Utilitarul cdecl
Utilitarul cdecl (utilizat in mod frecvent pe sistem Unix/Linux) poate citi declaratii in limbajele C si C++ si le poate decodifica.
Programul poate fi rulat si online (http://www.lemoda.net/c/cdecl/index.cgi)
Daca introducem declaratia noastra (adaugand cuvantul explain in fata)
- explain char*(*(*(* const myVar[2])(int))[4])(int);
Obtinem:
declare myVar as array 2 of const pointer to function (int) returning pointer to array 4 of pointer to function (int) returning pointer to char
Welcome to BitCell. Click here to register !
