Unitate de traducere (programare) - Translation unit (programming)

În terminologia limbajului de programare C și C ++ , o unitate de traducere (sau mai mult întâmplător o unitate de compilare) este intrarea finală într-un compilator C sau C ++ din care este generat un fișier obiect . O unitate de traducere constă aproximativ dintr-un fișier sursă după ce a fost procesat de preprocesorul C , ceea ce înseamnă că fișierele antet listate în #include directive sunt literalmente incluse , secțiunile de cod din interior #ifndef pot fi incluse și macrocomenzile au fost extinse.

Context

Programul AC este alcătuit din unități numite fișiere sursă (sau preprocesare fișiere ), care, în plus față de codul sursă, include directivele pentru preprocesorul C . O unitate de traducere este ieșirea preprocesatorului C - un fișier sursă după ce a fost preprocesat .

Preprocesarea constă în special în extinderea unui fișier sursă pentru a înlocui recursiv toate #include directivele cu fișierul literal declarat în directivă (de obicei fișiere antet , dar posibil alte fișiere sursă); rezultatul acestui pas este o unitate de traducere preprocesare . Etape suplimentare includ extinderea macro a #define directivelor și compilarea condiționată a #ifdef directivelor, printre altele; aceasta traduce unitatea de traducere preprocesare într-o unitate de traducere . Dintr-o unitate de traducere, compilatorul generează un fișier obiect , care poate fi procesat și legat în continuare (posibil cu alte fișiere obiect) pentru a forma un program executabil .

Rețineți că preprocesorul este, în principiu, un limbaj agnostic și este un preprocesor lexical , care funcționează la nivel de analiză lexicală - nu face analize și, prin urmare, nu poate face nicio prelucrare specifică sintaxei C. Intrarea în compilator este unitatea de traducere și, prin urmare, nu vede nicio directivă de preprocesor, care au fost toate procesate înainte de începerea compilării. În timp ce o unitate de traducere dată se bazează fundamental pe un fișier, codul sursă real introdus în compilator poate apărea substanțial diferit de fișierul sursă pe care programatorul îl vizualizează, în special datorită includerii recursive a anteturilor.

Domeniul de aplicare

Unitățile de traducere definesc un domeniu , aproximativ un fișier , și funcționează similar cu modulul ; în terminologia C, aceasta este denumită legătură internă , care este una dintre cele două forme de legătură din C. Numele (funcțiile și variabilele) declarate în afara unui bloc funcțional pot fi vizibile fie numai într-o unitate de traducere dată, caz în care se spune că au legături interne - nu sunt vizibile pentru linker - sau pot fi vizibile pentru alte fișiere obiect, caz în care se spune că au legături externe și sunt vizibile pentru linker.

C nu are o noțiune de module. Cu toate acestea, fișierele obiecte separate (și, prin urmare, și unitățile de traducere utilizate pentru a produce fișiere obiect) funcționează în mod similar cu modulele separate și, dacă un fișier sursă nu include alte fișiere sursă, legătura internă (sfera unității de traducere) poate fi considerată „fișier domeniul de aplicare, inclusiv toate fișierele antet ".

Organizarea codului

Cea mai mare parte a codului unui proiect este de obicei păstrată în fișiere cu .c sufix (sau .cpp , .cxx sau .cc pentru C ++ , dintre care .cpp este utilizat cel mai convențional). Fișierele destinate a fi incluse au de obicei un .h sufix ( .hpp sau .hh sunt utilizate și pentru C ++, dar .h este cel mai comun chiar și pentru C ++) și, în general, nu conțin definiții de funcții sau variabile pentru a evita conflictele de nume atunci când anteturile sunt incluse în mai multe fișiere sursă, ca este adesea cazul. Fișierele antet pot fi și sunt adesea incluse în alte fișiere antet. Este o practică standard pentru toate .c fișierele dintr-un proiect să includă cel puțin un .h fișier.

Vezi si

Referințe