Daca oi spune prostii sa nu loviti prea tare :). <div><br></div><div><br><div class="gmail_quote">2011/2/21 Razvan Deaconescu <span dir="ltr"><<a href="mailto:razvan.deaconescu@cs.pub.ro">razvan.deaconescu@cs.pub.ro</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On 02/21/2011 09:02 PM, Catalin Nicutar wrote:<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<br>
> pentru<br>
> erorile inerente.<br>
<br>
</div>Erorile nu prea l-am găsit dar clientul tău de mail are o interfață oribilă.<br>
<div class="im"><br>
> Obiectele externe, spre deosebire de cele interne, au linkage. Exista<br>
> "internal<br>
> linkage" si "external linkage". Un identificator are in mod implicit<br>
> external<br>
> linkage - adaugandu-i cuvantul cheie "static" ii dam internal linkage (este<br>
> cu<br>
> adevarat nefericita coliziunea de nume, "static" inseamna altceva pentru<br>
> identificatorii dintr-un bloc) .<br>
<br>
</div>Exact. Linkage are legătură cu procesul de linking (duh!). Linker-ul, în<br>
momentul în care rezolvă simbolurile ține cont "linkage-ul" acestora.<br>
<div class="im"><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>
</div>Discuția asta o lăsăm pe altă dată :-)<br>
<br>
--<br>
Ca să continuăm în acest sens, cu ce diferă declarația:<br>
<br>
int f(int a, int b);<br>
<br>
de<br>
<br>
extern int f(int a, int b);</blockquote><div><br></div><div>Declaratiile nu difera cu nimic, conform ansi c (si wikipedia :) ). Cuvantul cheie extern anunta existenta definitiei in alt loc (e.g. fisier). Oricum, se pare ca toate prototipurile sunt externe in ansi c (e.g. prototipurile din headere...)</div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
--<br>
Altul: Fie următoarele<br>
<br>
extern int b; /* global variable */<br>
static int c;<br>
<br>
b referă un external object, are "external linkage", "file scope".<br>
c referă un external object, are "internal linkage", "file scope".<br>
<br>
În cazul<br>
<br>
int f(int a, int b)<br>
{<br>
int prod;<br>
static int sum;<br>
<br>
...<br>
}<br>
<br>
Ce se poate spune despre prod și sum? Cu ce diferă cele două din<br>
perspectiva unor terminologii legate de limbajul C? (precum identifier<br>
scope, identifier linkage)<br>
--<br>
Unde sunt stocate variabilele precedate de static în cadrul unei<br>
funcții? (variabila sum din exemplul de mai sus)<br></blockquote><div><br></div><div>Ambele au "block scope" sau "function scope" (despre care vorbea si Catalin), doar ca prod se aloca pe stiva, iar sum pe heap, tocmai pentru a evita pop-ul facut stivei la iesirea din functie si pentru a pastra valorile intre apeluri. </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font color="#888888">--<br>
<br>
Răzvan<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
<a href="http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii" target="_blank">http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii</a></div></div></blockquote></div><br><br clear="all"><br>-- <br>Alexandru Damian<br><br>Polytechnic University of Bucharest<br>
Faculty of Automatic Control and Computers<br>
</div>