[so] [Tech Q] scope & linkage

Catalin Nicutar catalin.nicutar at cti.pub.ro
Mon Feb 21 21:02:10 EET 2011


    > * La ce se refera conceptele de "scope" ?i "linkage" în contextul
    > programarii în limbajul C? Ce clasificari induc aceste concepte?
    >
    > Da?i reply la acest mesaj pentru raspunsuri sau discu?ii.

    Nu se implica încumeta nimeni? Urmeaza întrebari mai interesante dupa,
    dar trebuie sa trece?i de asta :-)

    Razvan
    _______________________________________________
    http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii


Okay, daca urmeaza intrebari mai interesante dupa :-).
tl;dr : Imi cer scuze ca e asa lung post-ul si in mod cert imi cer scuze
pentru
erorile inerente.

Din ce stiu ambele concepte se refera la lucruri asemanatoare in C, in
esenta la
accesibilitatea identificatorilor.

In C un nume (un identificator) are scope. Scope-ul decide care sunt partile
unui program care pot accesa un nume :). Exista:

    * block-level scope
    * function prototype scope
    * file scope

- Identificatorii definiti intr-un scope "block" (adica intre acolade) nu
sunt
vizibili decat acolo. In mod normal (C89) variabilele dintr-un bloc sunt
declarate la inceput. C99 permite sa le declari unde vrei.

<anti vs rant>Visual Studio 2010 inca nu suporta decat partial C99 :-).
Serios,
definiti un proiect win32, adaugati un fisier cu extensia .c (nu cpp) si
incercati sa definiti o variabila dupa inceputul functiei). Din ce scria un
VS
fanboy pe un blog, aparent MS se axeaza pe C++0x </anti vs rant>.

- Exista si "function prototype scope". Spre exemplu in prototipul

int foo (int bar, int baz);

"bar" si "baz" sunt definite din momentul in care apar pana in momentul in
care
se incheie prototipul (atentie, ma refer la prototip deci la declaratie, nu
la
definitie - prefer sa consider definitia unei functii sub regulile
"block-level
scope"). In general numele pot fi (si sunt) omise. Doar tipurile conteaza.

- Pentru file scope trebuie sa discutam despre linkage. In C exista obiecte
externe (fie variabile fie functii) care nu sunt definite in nici o alta
functie
(extern versus intern). Functiile sunt mereu interne - C nu permite functii
nested ("imbricate" :P).

Obiectele externe, spre deosebire de cele interne, au linkage. Exista
"internal
linkage" si "external linkage". Un identificator are in mod implicit
external
linkage - adaugandu-i cuvantul cheie "static" ii dam internal linkage (este
cu
adevarat nefericita coliziunea de nume, "static" inseamna altceva pentru
identificatorii dintr-un bloc) .

Un identificator cu external linkage poate fi folosit oriunde intr-un
program cu
multe fisiere. Un identificator cu internal linkage poate fi folosit oriunde
in
fisier. (Okay, nu e vorba de "fisiere" ci de "translation units").

Trebuie avut grija la un aspect legat de definire. In mod normal definim o
variabila sus in fisier si o folosim in functii fara probleme. *Daca o
functie
refera o variabila inainte ca aceasta sa fie definita sau variabila e
definita in alt fisier, trebuie folosit cuvantul cheie "extern".

E mereu importanta distinctia dintre a declara si a defini (eu nu ma simt in
stare sa atac subiectul insa K&R il refera in fiecare capitol impreuna cu
"storage classes").

Catalin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20110221/7b4469f3/attachment.htm>


More information about the so mailing list