Bine ati venit pe ItAssistant. Aceasta noua serie de tutoriale isi propune sa va familiarizeze cu limbajul de programare C si conceptele Programarii Structurata.
Preprocesorul C
Preprocesorul este componenta din cadrul compilatorului C care realizează preprocesarea.
În urma acestui pas, toate instrucţiunile de preprocesare sunt înlocuite (substituite), pentru a genera cod C „pur”. Preprocesarea este o prelucrare exclusiv textuală a fişierului sursă. În acest pas nu se fac nici un fel de verificări sintactice sau semantice asupra codului sursă, ci doar sunt efectuate substituţiile din text. Astfel, preprocesorul va prelucra şi fişiere fără nici un sens în C.
Spre exemplu, fiind considerat fişierul rubbish.c cu următorul conţinut:
#define EA Ana #define si C #ifdef CIFRE #define CINCI 5 #define DOUA 2 EA are mere. Mara are DOUA pere shi CINCI cirese. #endif Vasilica vrea sa cante o melodie in si bemol.
La rularea comenzii
gcc -E -DCIFRE rubbish.c
se va obţine următoare ieşire (se cere compilatorului să execute doar pasul de preprocesare (-E), definind în acelaşi timp şi simbolul CIFRE (-DCIFRE) :
# 1 "rubbish.c" # 1 "<built-in>" # 1 "<command line>" # 1 "rubbish.c" Ana are mere. Mara are 2 pere shi 5 cirese. Vasilica vrea sa cante o melodie in C bemol.
Cele mai importante instrucţiuni de preprocesare sunt prezentate în continuare.
Incluziune
Probabil cea mai des folosită instrucţiune de preprocesare este cea de incluziune, de forma
#include <nume_fişier>sau
#include "nume_fisier"care are ca rezultat înlocuirea sa cu conţinutul fişierului specificat de nume_fişier. Diferenţa dintre cele două versiuni este că cea cu paranteze unghiulare caută nume_fişier doar în directorul standard de fişiere antet (numit deobicei include), iar cea cu ghilimele caută atât în directorul include cât şi în directorul curent.
C – Definirea de simboluri
Definirea de simboluri este cel mai des folosită în conjuncţie cu instrucţiunile de procesare condiţionată, fiind folosită pentru activarea şi dezactivarea unor segmente de cod în funcţie de prezenţa unor simboluri. Definirea unui simbol se face în cod cu instrucţiunea
#define SIMBOLsau se poate realiza şi la compilare, prin folosirea flagului -D al compilatorului (după cum am văzut în exemplul precedent).
Un simbol poate fi de asemenea „şters” folosind instrucţiunea
#undef SIMBOLîn cazul în care nu se mai doreşte prezenţa simbolului de preprocesor ulterior definirii sale.
C – Definirea de macro-uri
Instrucţiunile de preprocesare mai pot fi folosite şi pentru definirea de constante simbolice şi macroinstrucţiuni. De exemplu
#define CONSTANTA valoareva duce la înlocuirea peste tot în cadrul codului sursă a şirului CONSTANTA cu şirul valoare. Înlocuirea nu se face totuşi în interiorul şirurilor de caractere.
O macroinstrucţiune este similară unei constante simbolice, ca definire, dar acceptă parametrii. Este folosită în program în mod asemănător unei funcţii, dar la compilare, ea este înlocuită în mod textual cu corpul ei. În plus, nu se face nici un fel de verificare a tipurilor. Spre exemplu:
#define MAX(a, b) a > b ? a : bva returna maximul dintre a şi b, iar
#define DUBLU(a) 2*ava returna dublul lui a.
Atenţie! Deoarece preprocesarea este o prelucrare textuală a codului sursă, în cazul exemplului de mai sus, macroinstrucţiunea în forma prezentată nu va calcula întotdeauna dublul unui număr.
Astfel, la un apel de forma:
DUBLU(a + 3)
în pasul de preprocesare se va genera expresia
2*a+3
care bineînţeles că nu realizează funcţia dorită.
Pentru a evita astfel de probleme, este bine ca întotdeauna în corpul unui macro, numele „parametrilor” să fie închise între paranteze (ca de exemplu:)
#define SQUARE(a) (a)*(a)C – Instrucţiuni de compilare condiţionată
Instrucţiunile de compilare condiţionată sunt folosite pentru a „ascunde” fragmente de cod în funcţie de anumite condiţii. Formatul este următorul:
#if conditie .... #else .... #endif
unde conditie este este o expresie constantă întreagă. Pentru realizarea de expresii cu mai multe opţiuni se poate folosi şi forma #elif:
#if conditie ... #elif conditie2 ... #elif conditie3 ... #else ... #endif
De obicei condiţia testează existenţa unui simbol. Scenariile tipice de folosire sunt:
- dezactivarea codului de debug o dată ce problemele au fost remediate
- compilare condiţionată în funcţie de platforma de rulare
- prevenirea includerii multiple a fişierelor antet
În aceste cazuri se foloseşte forma
#ifdef SIMBOLsau
#ifndef SIMBOLcare testează dacă simbolul SIMBOL este definit, respectiv nu este definit.
Prevenirea includerii multiple a fişierelor antet se realizează astfel:
#ifndef _NUME_FISIER_ANTET_ #define _NUME_FISIER_ANTET_ /* corpul fisierului antet */ /* prototipuri de functii, declaratii de tipuri si de constante */ #endif
Astfel, la prima includere a fişierului antet, simbolul _NUME_FISIER_ANTET_ nu este definit. Preprocesorul execută ramura #ifndef în care este definit simbolul _NUME_FISIER_ANTET_ şi care conţine şi corpul – conţinutul util – al fişierului antet.
La următoarele includeri ale fişierului antet simbolul _NUME_FISIER_ANTET_ va fi definit iar preprocesorul va sări direct la sfârşitul fişierului antet, după #endif.
Alte instrucţiuni
#pragma expresieSunt folosite pentru a controla din codul sursă comportamentul compilatorului (modul în care generează cod, alinierea structurilor, etc.) iar formatul lor diferă de la compilator la compilator. Pentru a determina ce opţiuni #pragma aveţi la dispoziţie consultaţi manualul compilatorului.
#error MESSAGELa întâlnirea acestei instrucţiuni de preprocesare compilatorul va raporta o eroare, având ca text explicativ mesajul MESSAGE.
#line NUMBER FILENAMEAceastă instrucţiune de preprocesare modifică numărul liniei curente în valoarea specificată de NUMBER. În cazul în care este prezent şi parametru opţional FILENAME este modificat şi numele fişierului sursă curent.
Astfel, mesajele de eroare şi avertismentele produse de compilator vor folosi numere de linie (şi eventual nume de fişiere) inexistente, „imaginare”, conform acestei instrucţiuni.
Sursa tutorialului: http://cursuri.cs.pub.ro/~programare/w/index.php/Pagina_principal%C4%83
Related posts:
- Invata Limbajul de Programare C – Partea 12
- Invata Limbajul de Programare C – Partea 4
- Invata Limbajul de Programare C – Partea 1
- Invata Limbajul de Programare C – Partea 5
- Invata Limbajul de Programare C – Partea 6



