Citirea declaratiilor complexe in limbajul C

Raspunsuri la intrebari frecvente despre limbajele C si C++

Citirea declaratiilor complexe in limbajul C

Postby morpheus » 29 Jan 2011, 19:37

Citirea declaratiilor complexe in limbajul C


Cum citim o declaratie complexa intr-un program C ?
De exemplu, ce inseamna:
  1.  
  2. char*(*(*(* const myVar[2])(int))[4])(int)  
  3.  

?

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)
  1.  
  2. explain char*(*(*(* const myVar[2])(int))[4])(int);
  3.  

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
2p / 2 votes
User avatar
morpheus
Word
 
Joined: 30 Dec 2009
Location: Bucharest, Romania
Status: 54.84

Re: Citirea declaratiilor complexe in limbajul C

Postby v0id » 29 Jan 2011, 19:37

Highly appreciated!
Am intalnit de multe ori declaratii de genul asta in C++, chiar daca nu atat de complexe. Eu nefiind deloc un mare fan C++, iti dai seama ce reactii imi provocau... Acum cu link-ul postat de tine, ar trebui sa fie mult mai usor... Sper :)
Thanks!
0,0p / 0 votes
A good coder is never on holiday - he may be working on a different machine, that's about as far as it gets.
User avatar
v0id
Word
 
Joined: 05 Jan 2010
Location: 127.0.0.1
Status: 42.5

Re: Citirea declaratiilor complexe in limbajul C

Postby morpheus » 29 Jan 2011, 19:41

Cu placere. Ma bucur ca iti e util.
0,0p / 0 votes
User avatar
morpheus
Word
 
Joined: 30 Dec 2009
Location: Bucharest, Romania
Status: 54.84


Return to C/C++ FAQ

Who is online

Users browsing this forum: No registered users and 0 guests

cron