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

761

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
761
On Slideshare
0
From Embeds
0
Number of Embeds
0
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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×