Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                  Macrodefinitii
                               ,     Preprocesare conditionat˘
       ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,      Preprocesare conditionat˘
          ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                  Macrodefinitii
                               ,     Preprocesare conditionat˘
       ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                     Macrodefinitii
                                  ,     Preprocesare conditionat˘
 ...
Notiuni generale
  ,                     Macrodefinitii
                                  ,     Preprocesare conditionat˘
 ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                  Macrodefinitii
                               ,      Preprocesare conditionat˘
      ...
Notiuni generale
  ,                  Macrodefinitii
                               ,     Preprocesare conditionat˘
       ...
Notiuni generale
  ,                  Macrodefinitii
                               ,     Preprocesare conditionat˘
       ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Notiuni generale
  ,                Macrodefinitii
                             ,     Preprocesare conditionat˘
           ...
Upcoming SlideShare
Loading in …5
×

ROSEdu Tech Talks Prezentarea 01: Preprocesorul C

847 views
790 views

Published on

Prima prezentare din Proiectul ROSEdu Tech Talks cu titlul "Preprocesorul C" ținută de Răzvan Deaconescu pe data de 10 Octombrie 2009 în UPB.

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
847
On SlideShare
0
From Embeds
0
Number of Embeds
75
Actions
Shares
0
Downloads
12
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

ROSEdu Tech Talks Prezentarea 01: Preprocesorul C

  1. 1. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Preprocesorul C Tech Talks R˘zvan Deaconescu a razvan@rosedu.org ROSEdu 10 octombrie 2009 1 / 41
  2. 2. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile 1 Notiuni generale , 2 Macrodefinitii , 3 Preprocesare conditionat˘ , a 4 Includerea fisierelor header , 5 Altele 6 Resurse utile 2 / 41
  3. 3. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile 1 Notiuni generale , 2 Macrodefinitii , 3 Preprocesare conditionat˘ , a 4 Includerea fisierelor header , 5 Altele 6 Resurse utile 3 / 41
  4. 4. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Rolul preprocesorului C Includerea fisierelor header , Expandarea macro-urilor Compilare conditionat˘ , a Diagnosticare 4 / 41
  5. 5. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Invocarea preprocesorului Intern de compilator gcc -Wall file.c Intern de compilator doar pentru faza preproces˘rii a gcc -Wall -E file.c -o file.i Cu ajutorul comenzii cpp cpp file.c file.i 5 / 41
  6. 6. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Exemplu de utilizare 1 # 1 "sample.c" 2 # 1 "<built-in>" 3 # 1 "<command-line>" 4 # 1 "sample.c" 5 # 1 "sample.h" 1 1 #include "sample.h" 6 2 7 3 #define TEST NUM 25 8 4 #define MAX(a, b) ((a) > (b) ? (a) : 9 int test fun(int num); (b)) 10 int test max(int num); 5 11 # 2 "sample.c" 2 6 int main(void) 12 7 { 13 8 test fun(TEST NUM); 14 9 test max(MAX(5, 10)); 15 10 16 int main(void) 11 return 0; 17 { 12 } 18 test fun(25); 19 test max(((5) > (10) ? (5) : (10))); 20 21 return 0; 22 } 6 / 41
  7. 7. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile 1 Notiuni generale , 2 Macrodefinitii , 3 Preprocesare conditionat˘ , a 4 Includerea fisierelor header , 5 Altele 6 Resurse utile 7 / 41
  8. 8. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Directivele #define si #undef , Directivele de preprocesare ˆ ıncep cu # Definirea si anularea definirii , #define MY VAR 50 #undef MY VAR a = a + MY VAR → a = a + 50 8 / 41
  9. 9. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Macro-uri simple (object-like macros) #define NUME VALOARE NUME respect˘ regulie de nume pentru o variabil˘ a a VALOARE poate s˘ contin˘ aproape orice a , a Se ˆ ınlocuieste NUME cu VALOARE peste tot , 9 / 41
  10. 10. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Stupid example 1 # 1 "stupid example.c" 2 # 1 "<built-in>" 1 #define begin { 3 # 1 "<command-line>" 2 #define end } 4 # 1 "stupid example.c" 3 #define stop return 0 5 4 6 5 int main(void) 7 6 begin 8 7 printf("Hello, 9 int main(void) World!n"); 10 { 8 11 printf("Hello, World!n"); 9 stop; 12 10 end 13 return 0; 14 } 10 / 41
  11. 11. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Folosirea parantezelor O greseal˘ frecvent˘ , a a Once upon a time during a PSO lab (2006-2007) #define NR syscalls MY SYSCALL NO+1 ... new syscall table = malloc(NR syscalls * sizeof(void *)); Nu faceti asa , , #define MAX(a, b) (a > b ? a : b) Faceti asa , , #define MAX(a, b) ((a) > (b) ? (a) : (b) E OK tot timpul? 11 / 41
  12. 12. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Macro-uri vs. const Avantaje macro-uri mai rapide (faza de preprocesare) interpretate la preprocesare nu ocup˘ spatiu ˆ memorie a , ın Avantaje const type safety sunt, de fapt, variabile (au o adres˘) a ˆ C++ se pot folosi la preprocesare ın 12 / 41
  13. 13. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Macro-uri vs. enum Avantaje macro-uri flexibile (nu sunt limitate la valori ˆ ıntregi) nu impun constrˆngeri de spatiu ocupat a , Avantaje enum type safety block scope 13 / 41
  14. 14. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Macro-uri predefinite $ gcc -dM -E sample.c #define CHAR BIT 8 #define unix 1 #define x86 64 1 #define SHRT MAX 32767 #define linux 1 #define gnu linux 1 #define SAMPLE H 1 #define TEST NUM 25 #define MAX(a,b) ((a) > (b) ? (a) : (b)) #define STDC 1 $ gcc -dM -E sample.c | wc -l 131 14 / 41
  15. 15. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Definirea de macro-uri ˆ linia de comand˘ ın a $ gcc -DMY MACRO=40 -Wall comm.c $ ./a.out MY MACRO = 40 $ gcc -dM -E code/sample.c | grep linux #define linux 1 $ gcc -U linux -dM -E code/sample.c | grep linux $ 15 / 41
  16. 16. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Macro-uri cu parametri (function-like macros) #define echo() printf("Hello, World!n"); #define max(a, b) ((a) > (b) ? (a) : (b)) #define do error(msg) perror(msg); exit(EXIT FAILURE); E ceva gresit? , if (error condition) do error(); 16 / 41
  17. 17. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Macro-uri cu parametri (cont.) #define do error(msg) { perror(msg); exit(EXIT FAILURE); } Inconsistent˘ - nu e nevoie de ; (punct si virgul˘) la apel ,a , a #define do error(msg) do { perror(msg); exit(EXIT FAILURE); } while (0) Perfect! 17 / 41
  18. 18. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Macro-uri vs. functii inline , Avantaje functii inline , type safety f˘r˘ b˘t˘i de cap aa aa Avantaje macro-uri sunt portabile unele lucruri se realizeaz˘ mai greu cu functii inline (argumente a , transmise prin adres˘)a unele lucruri nu se pot face cu functii inline , #define container of(ptr, type, member) (type *)( (char *)ptr - offsetof(type,member)) 18 / 41
  19. 19. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Macro-uri cu num˘r variabil de argumente (variadic a macros) Similar functiilor cu num˘r variabil de argumente , a ˆ standardul C99 In #define DEBUG(fmt, ...) fprintf(stderr, fmt, VA ARGS ); O problem˘: apel DEBUG("problema"); a Solutie: token paste operator (##) (extensie GNU) , #define DEBUG(fmt, ...) fprintf(stderr, fmt, ## VA ARGS ); 19 / 41
  20. 20. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Probleme ˆ folosirea macro-urilor ın Precedenta operatorilor , solutie: folosirea parantezelor , Omiterea operatorului ; (punct si virgul˘) , a solutie: folosirea do { ... , } while(0) Linii multiple solutie: folosirea operatorului (backslash) , 20 / 41
  21. 21. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile 1 Notiuni generale , 2 Macrodefinitii , 3 Preprocesare conditionat˘ , a 4 Includerea fisierelor header , 5 Altele 6 Resurse utile 21 / 41
  22. 22. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Directive de preprocesare conditionat˘ , a #if expresie conditionala #if defined macro / #ifdef macro #endif #else #elif 22 / 41
  23. 23. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Asigurarea portabilit˘tii a, 1 #include <stdio.h> 2 3 int main (void) 4 { 5 #if defined ( linux ) 6 printf ("This is Linux.n"); 7 #elif defined ( win32 ) 8 printf ("This is Win32.n"); 9 #else 10 printf ("This is Sparta.n"); 11 #endif 12 13 return 0; 14 } 23 / 41
  24. 24. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile “Eliminarea” codului Util pentru “comentarii” Trebuie s˘ contin˘ cod “preprocesabil” a , a #if 0 aaaa /* ... */ if ... for ... ... #endif 24 / 41
  25. 25. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Activare/dezactivare mod debug 1 #ifndef DEBUG H 2 #define DEBUG H 1 3 4 #if defined DEBUG 5 #define Dprintf(format, ...) 6 fprintf(stderr, "[%s]:%s:%d: " format, FILE , 7 func , LINE , ## VA ARGS ) 8 #else 9 #define Dprintf(format, ...) do { } while(0) 10 #endif 11 12 #endif Se poate defini un macro ˆ acelasi fisier header ın , , Se poate folosi linia de comand˘ gcc -DDEBUG a ... Avansat, se pot stabili niveluri de jurnalizare (DEBUG LEVEL + Dprintf info, Dprintf warn etc.) 25 / 41
  26. 26. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Combinare cod C si cod C++ , Compilatorul de C++ face “name mangling” Linker-ul nu recunoaste simbolurile , 1 #ifndef MIX HEADER H 2 #define MIX HEADER H 1 3 4 #ifdef cplusplus 5 extern "C" { 6 #endif 7 8 void fun1(void); 9 void fun2(void); 10 11 #ifdef cplusplus 12 } 13 #endif 14 15 #endif 26 / 41
  27. 27. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile 1 Notiuni generale , 2 Macrodefinitii , 3 Preprocesare conditionat˘ , a 4 Includerea fisierelor header , 5 Altele 6 Resurse utile 27 / 41
  28. 28. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Directiva #include Permite inserarea unui fisier header , Se copiaz˘ continutul acelui fisier a , , Poate fi (si de obicei este) folosit˘ pe mai multe niveluri (un , a fisier header include alte fisiere header) , , 28 / 41
  29. 29. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Exemplu de structur˘ de fisier header a , #ifndef MY HEADER H #define MY HEADER H 1 ... #endif Macro-uri de gard˘/control a Previn includerea de mai multe ori a aceluiasi fisier , , Denumite, ˆ general MY HEADER H, MY HEADER H (rezervate ın pentru biblioteca standard), MY HEADER H , MY HEADER H 29 / 41
  30. 30. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Ce contine un fisier header? , , Macro de gard˘ (#ifndef ...) a Includerea altor fisiere header , se folosesc tipuri definite ˆ alt header ın se folosesc functii (vezi Dprintf) , Macro-uri Structuri de date si enumer˘ri , a Declaratii externe de variabile , Declaratii (antete) de functii , , Functii statice , Functii inline (de asemenea statice) , Sfˆrsit macro de gard˘ (#endif) a , a 30 / 41
  31. 31. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile De ce nu se include un fisier C? , Un fisier C contine functii si variabile globale care pot fi , , , , non-statice Dac˘ acel fisier e inclus de dou˘ fisiere diferite care sunt a , a , link-editate apare conflict de forma already defined Un fisier header nu trebuie s˘ aib˘ forma unui fisier C , a a , f˘r˘ variabile globale non-statice aa f˘r˘ functii non-statice aa , 31 / 41
  32. 32. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile #include <file.h> vs. #include ”file.h” #include <file.h> system headers c˘utare ˆ a ıntr-un set de directoare predefinite localizate preponderent ˆ /usr/include si ın , /usr/local/include #include "file.h" local headers c˘utare ˆ a ıncepˆnd cu directorul local a 32 / 41
  33. 33. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Extinderea c˘ii de c˘utare a fisierelor header a a , CPPFLAGS = -I/usr/include/gdk/ -iquote../include Forma #include <file.h> caut˘ ˆ ai ˆ directoarele a ıntˆ ın marcate cu -I si apoi ˆ cele implicite , ın Forma #include "file.h" caut˘ ˆ directoarele marcate cu a ın -iquote, apoi ˆ cele marcate cu -I, apoi ˆ directorul local ın ın si apoi ˆ cele implicite , ın 33 / 41
  34. 34. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile 1 Notiuni generale , 2 Macrodefinitii , 3 Preprocesare conditionat˘ , a 4 Includerea fisierelor header , 5 Altele 6 Resurse utile 34 / 41
  35. 35. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Stringification Operatorul # ˆ fata unui argument al unui macro ın , Constructia este un sir de caractere reprezentˆnd numele , , a argumentului 1 #include <stdio.h> 2 3 #define DBG(val, fmt) 4 fprintf(stderr, #val " = " fmt "n", val) 5 6 int main(void) 7 { 8 int a = 42; 9 char *s = "hax0r"; 10 11 DBG(a, "%d"); 12 DBG(s, "%s"); 13 14 return 0; 15 } 35 / 41
  36. 36. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Concatenare Preprocesorul concateneaz˘ sirurile adiacente a , "an" "a" " a" "re" → "ana are" Operatorul ## concateneaz˘ doi tokeni ˆ a ıntr-unul singur Wanna see something really scary? 1 #include <stdio.h> 2 3 #define SYSCALL(ret, name, ...) ret sys ## name( VA ARGS ) 4 5 SYSCALL(int, open, const char *path, int oflag, int mode) 6 { 7 /* TODO */ 8 return 0; 9 } 10 11 SYSCALL(int, read, int fildes, void *buf, size t nbytes) 12 { 13 /* TODO */ 14 return 0; 15 } 36 / 41
  37. 37. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Diagnosticare Directiva #error forteaz˘ eroare de preprocesare si ˆ , a , ıncheierea actiunii , Directiva #warning permite continuarea proces˘rii a 1 #include <stdio.h> 2 3 int main(void) 4 { 5 #ifdef x86 64 6 #warning "why?" 7 #endif 8 9 #if defined linux && ! defined DEBUG 10 #error "DEBUG marco must be defined on Linux" 11 #endif 12 13 printf("Hello, World!n"); 14 15 return 0; 16 } 37 / 41
  38. 38. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile 1 Notiuni generale , 2 Macrodefinitii , 3 Preprocesare conditionat˘ , a 4 Includerea fisierelor header , 5 Altele 6 Resurse utile 38 / 41
  39. 39. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Link-uri http://en.wikipedia.org/wiki/C_preprocessor http://c-faq.com/cpp/index.html 39 / 41
  40. 40. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile Altele man cpp info cpp comp.lang.c (Usenet) ##c (IRC, Freenode) 40 / 41
  41. 41. Notiuni generale , Macrodefinitii , Preprocesare conditionat˘ , a Includerea fisierelor header , Altele Resurse utile ˆ Intreb˘ri a 41 / 41

×