Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so:laboratoare:resurse:c_tips [2015/03/02 21:05]
adrian.stanciu [Structura unui fișier header]
so:laboratoare:resurse:c_tips [2016/06/05 17:51] (current)
adrian.stanciu [Folosirea specificatorului static pentru variabile globale și funcții]
Line 53: Line 53:
 </​code>​ </​code>​
   * declară variabilele globale exportate de modul (declarate cu keyword-ul **extern**)   * declară variabilele globale exportate de modul (declarate cu keyword-ul **extern**)
-  * conține prototipurile funcțiilor exportate; **NU** se exportă funcțiile ce sunt folosite doar intern de către modul (funcțiile folosite intern trebuie definite în surse folosind keyword-ul **static**)+  * conține prototipurile funcțiilor exportate; **NU** se exportă funcțiile ce sunt folosite doar intern de către modul (funcțiile folosite intern trebuie definite în fișierele sursă (.c) folosind keyword-ul **static**)
   * poate conține definiții de funcții inline ce trebuiesc partajate   * poate conține definiții de funcții inline ce trebuiesc partajate
   * **NU** conține cod executabil cu excepția funcțiilor inline și a macro-urilor   * **NU** conține cod executabil cu excepția funcțiilor inline și a macro-urilor
 +
 ==== Alocare și eliberare de resurse ==== ==== Alocare și eliberare de resurse ====
  
 O practică bună este ca atunci când scriem o instrucțiune ce alocă o resursă (alocare dinamică de memorie, deschidere a unui fișier) să scriem și instrucțiunea asociată care eliberează acea resursă atunci când nu mai este necesară. În acest fel ne asigurăm că nu ținem ocupate resursele sistemului mai mult decât este cazul. O practică bună este ca atunci când scriem o instrucțiune ce alocă o resursă (alocare dinamică de memorie, deschidere a unui fișier) să scriem și instrucțiunea asociată care eliberează acea resursă atunci când nu mai este necesară. În acest fel ne asigurăm că nu ținem ocupate resursele sistemului mai mult decât este cazul.
 +
 +==== Folosirea de tool-uri pentru verificarea coding style-ului ====
 +
 +Un coding style bun, folosit consecvent, face mai ușoară și mai rapidă înțelegerea unui cod. Marile proiecte software îsi stabilesc un coding style și realizează utilitare pentru verificarea automată a acestuia. ​
 +[[https://​github.com/​torvalds/​linux/​blob/​master/​scripts/​checkpatch.pl | Checkpatch.pl]] este un script Perl folosit în kernelul Linux pentru a verifica coding style-ului patch-urilor ce urmează a fi submise.
  
 ===== Limbaj ===== ===== Limbaj =====
Line 423: Line 429:
   * declarația unui array extern:   * declarația unui array extern:
 <code c> <code c>
-extern int a[];+extern int a[]; // definit în alt modul ca: int a[N];
 </​code>​ </​code>​
   * definiția unui array; definiția este un caz special de declarație care alocă spațiu pentru array-ul definit și eventual îl inițializează cu diverse valori:   * definiția unui array; definiția este un caz special de declarație care alocă spațiu pentru array-ul definit și eventual îl inițializează cu diverse valori:
Line 443: Line 449:
 int m = *(a + i); int m = *(a + i);
 </​code>​ </​code>​
 +
 +==== Folosirea specificatorului "​static"​ pentru variabile globale și funcții ====
 +
 +O variabilă globală sau o funcție declarată cu specificatorul "​static"​ are internal [[http://​en.cppreference.com/​w/​c/​language/​storage_duration | linkage]], adică poate fi referită doar din translation unit-ul respectiv (un translation unit reprezintă un fișier sursă .c împreună cu toate fișierele header pe care acesta le include).
 +
 +Avantajele acestei practici sunt:
 +  * simbolurile sunt vizibile doar în translation unit-ul respectiv; astfel, se evită poluarea namespace-ului global și se reduc șansele conflictelor de nume
 +  * încapsulare:​ exte expusă doar interfața publică a modulului (nu și obiectele și funcțiile interne ce contribuie la implementarea interfeței)
  
 ===== Utilizare API ===== ===== Utilizare API =====
Line 481: Line 495:
   *[[http://​www.gnu.org/​software/​libc/​manual/​ | Documentația GNU C Library]]   *[[http://​www.gnu.org/​software/​libc/​manual/​ | Documentația GNU C Library]]
   *[[http://​linux.die.net/​man/​1/​indent | Tool pentru indentare]]   *[[http://​linux.die.net/​man/​1/​indent | Tool pentru indentare]]
- 
-~~DISCUSSION:​off~~ 
so/laboratoare/resurse/c_tips.1425323138.txt.gz · Last modified: 2015/03/02 21:05 by adrian.stanciu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0