<br> > * La ce se refera conceptele de "scope" ?i "linkage" în contextul<br> > programarii în limbajul C? Ce clasificari induc aceste concepte?<br> ><br> > Da?i reply la acest mesaj pentru raspunsuri sau discu?ii.<br>
<br> Nu se implica încumeta nimeni? Urmeaza întrebari mai interesante dupa,<br> dar trebuie sa trece?i de asta :-)<br><br> Razvan<br> _______________________________________________<br> <a href="http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii">http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii</a><br>
<br><br>Okay, daca urmeaza intrebari mai interesante dupa :-).<br>tl;dr : Imi cer scuze ca e asa lung post-ul si in mod cert imi cer scuze pentru<br>erorile inerente.<br><br>Din ce stiu ambele concepte se refera la lucruri asemanatoare in C, in esenta la<br>
accesibilitatea identificatorilor.<br><br>In C un nume (un identificator) are scope. Scope-ul decide care sunt partile<br>unui program care pot accesa un nume :). Exista:<br><br> * block-level scope<br> * function prototype scope<br>
* file scope<br><br>- Identificatorii definiti intr-un scope "block" (adica intre acolade) nu sunt<br>vizibili decat acolo. In mod normal (C89) variabilele dintr-un bloc sunt<br>declarate la inceput. C99 permite sa le declari unde vrei.<br>
<br><anti vs rant>Visual Studio 2010 inca nu suporta decat partial C99 :-). Serios,<br>definiti un proiect win32, adaugati un fisier cu extensia .c (nu cpp) si<br>incercati sa definiti o variabila dupa inceputul functiei). Din ce scria un VS<br>
fanboy pe un blog, aparent MS se axeaza pe C++0x </anti vs rant>.<br><br>- Exista si "function prototype scope". Spre exemplu in prototipul<br><br>int foo (int bar, int baz);<br><br>"bar" si "baz" sunt definite din momentul in care apar pana in momentul in care<br>
se incheie prototipul (atentie, ma refer la prototip deci la declaratie, nu la<br>definitie - prefer sa consider definitia unei functii sub regulile "block-level<br>scope"). In general numele pot fi (si sunt) omise. Doar tipurile conteaza.<br>
<br>- Pentru file scope trebuie sa discutam despre linkage. In C exista obiecte<br>externe (fie variabile fie functii) care nu sunt definite in nici o alta functie<br>(extern versus intern). Functiile sunt mereu interne - C nu permite functii<br>
nested ("imbricate" :P).<br><br>Obiectele externe, spre deosebire de cele interne, au linkage. Exista "internal<br>linkage" si "external linkage". Un identificator are in mod implicit external<br>
linkage - adaugandu-i cuvantul cheie "static" ii dam internal linkage (este cu<br>adevarat nefericita coliziunea de nume, "static" inseamna altceva pentru<br>identificatorii dintr-un bloc) .<br><br>Un identificator cu external linkage poate fi folosit oriunde intr-un program cu<br>
multe fisiere. Un identificator cu internal linkage poate fi folosit oriunde in<br>fisier. (Okay, nu e vorba de "fisiere" ci de "translation units").<br><br>Trebuie avut grija la un aspect legat de definire. In mod normal definim o<br>
variabila sus in fisier si o folosim in functii fara probleme. *Daca o functie<br>refera o variabila inainte ca aceasta sa fie definita sau variabila e<br>definita in alt fisier, trebuie folosit cuvantul cheie "extern".<br>
<br>E mereu importanta distinctia dintre a declara si a defini (eu nu ma simt in<br>stare sa atac subiectul insa K&R il refera in fiecare capitol impreuna cu<br>"storage classes").<br><br>Catalin<br>