Etapy kompilacji Wykład 7 Przetwarzanie wstępne, str 1 #define ILE 100 for(i=0; i<ile; i++)
Etapy kompilacji Wykład 7 Przetwarzanie wstępne, str 1 #define ILE 100 for(i=0; i<ile; i++) #include #define #if
Etapy kompilacji Wykład 7 Przetwarzanie wstępne, str 1 #define ILE 100 for(i=0; i<ile; i++) przetwarzanie wstępne #include #define #if for(i=0; i<100; i++)
Etapy kompilacji Wykład 7 Przetwarzanie wstępne, str 1 #define ILE 100 for(i=0; i<ile; i++) przetwarzanie wstępne #include #define #if for(i=0; i<100; i++) kompilacja właściwa binaria
Etapy kompilacji Wykład 7 Przetwarzanie wstępne, str 1 #define ILE 100 for(i=0; i<ile; i++) przetwarzanie wstępne #include #define #if for(i=0; i<100; i++) kompilacja właściwa dane binaria wyniki
Etapy kompilacji Wykład 7 Przetwarzanie wstępne, str 1 #define ILE 100 for(i=0; i<ile; i++) przetwarzanie wstępne #include #define #if for(i=0; i<100; i++) kompilacja właściwa dane Przetwarzanie wstępne preprocessing binaria wyniki
Wykład 7 Przetwarzanie wstępne, str 2 Przed właściwą kompilacją tekst programu jest przekształcany zgodnie z dyrektywami programisty
Wykład 7 Przetwarzanie wstępne, str 2 Przed właściwą kompilacją tekst programu jest przekształcany zgodnie z dyrektywami programisty To przekształcenie jest czysto tekstowe preprocesor nie zajmuje się logiką programu Nieostrożnie napisane dyrektywy mogą spowodować, że program nie da się skompilować, albo będzie działał błędnie
Wykład 7 Przetwarzanie wstępne, str 2 Przed właściwą kompilacją tekst programu jest przekształcany zgodnie z dyrektywami programisty To przekształcenie jest czysto tekstowe preprocesor nie zajmuje się logiką programu Nieostrożnie napisane dyrektywy mogą spowodować, że program nie da się skompilować, albo będzie działał błędnie
Wykład 7 Przetwarzanie wstępne, str 2 Przed właściwą kompilacją tekst programu jest przekształcany zgodnie z dyrektywami programisty To przekształcenie jest czysto tekstowe preprocesor nie zajmuje się logiką programu Nieostrożnie napisane dyrektywy mogą spowodować, że program nie da się skompilować, albo będzie działał błędnie Podstawowe dyrektywy: #include włączyć plik
Wykład 7 Przetwarzanie wstępne, str 2 Przed właściwą kompilacją tekst programu jest przekształcany zgodnie z dyrektywami programisty To przekształcenie jest czysto tekstowe preprocesor nie zajmuje się logiką programu Nieostrożnie napisane dyrektywy mogą spowodować, że program nie da się skompilować, albo będzie działał błędnie Podstawowe dyrektywy: #include włączyć plik #define zastąpić w tekście programu
Wykład 7 Przetwarzanie wstępne, str 2 Przed właściwą kompilacją tekst programu jest przekształcany zgodnie z dyrektywami programisty To przekształcenie jest czysto tekstowe preprocesor nie zajmuje się logiką programu Nieostrożnie napisane dyrektywy mogą spowodować, że program nie da się skompilować, albo będzie działał błędnie Podstawowe dyrektywy: #include włączyć plik #define zastąpić w tekście programu #if kompilować warunkowo
Wykład 7 Przetwarzanie wstępne, str 3 #include program na wielu plikach
Wykład 7 Przetwarzanie wstępne, str 3 #include program na wielu plikach #include"plik" plik Włącza(bez interpretowania) cały plik
Wykład 7 Przetwarzanie wstępne, str 3 #include program na wielu plikach #include"plik" plik Włącza(bez interpretowania) cały plik Dyrektywa#include"plik" włącza plik z aktualnego katalogu opracowany przez programistę
Wykład 7 Przetwarzanie wstępne, str 3 #include program na wielu plikach #include"plik" plik Włącza(bez interpretowania) cały plik Dyrektywa#include"plik" włącza plik z aktualnego katalogu opracowany przez programistę Dyrektywa#include<plik> włącza plik z katalogu kompilatora opracowany przez autora kompilatora
Wykład 7 Przetwarzanie wstępne, str 4 #include program na wielu plikach #include"globalne" intmain(){ printf("\n%s\n\n",haslo); return 0; }
Wykład 7 Przetwarzanie wstępne, str 4 #include program na wielu plikach #include"globalne" intmain(){ printf("\n%s\n\n",haslo); return 0; } Błędy: niezadeklarowane printf haslo
Wykład 7 Przetwarzanie wstępne, str 4 #include program na wielu plikach #include"globalne" intmain(){ printf("\n%s\n\n",haslo); return 0; } globalne #include<stdioh> char haslo[20] ="Naprzod!";
Wykład 7 Przetwarzanie wstępne, str 4 #include program na wielu plikach #include"globalne" intmain(){ printf("\n%s\n\n",haslo); return 0; } Drukuje: Naprzod! globalne #include<stdioh> char haslo[20] ="Naprzod!";
Wykład 7 Przetwarzanie wstępne, str 4 #include program na wielu plikach #include"globalne" intmain(){ printf("\n%s\n\n",haslo); return 0; } Drukuje: Naprzod! globalne #include<stdioh> char haslo[20] ="Naprzod!"; Plik inkludowany może inkludować inne pliki
Wykład 7 Przetwarzanie wstępne, str 5 #include program na wielu plikach Co inkludujemy, pisząc na początku programu #include<stdioh> lub #include<mathh> itp?
Wykład 7 Przetwarzanie wstępne, str 5 #include program na wielu plikach Co inkludujemy, pisząc na początku programu #include<stdioh> lub #include<mathh> itp? (Na sigmie te pliki mieszczą w/usr/include/ można zajrzeć)
Wykład 7 Przetwarzanie wstępne, str 5 #include program na wielu plikach Co inkludujemy, pisząc na początku programu #include<stdioh> lub #include<mathh> itp? (Na sigmie te pliki mieszczą w/usr/include/ można zajrzeć) W standardowym pliku nagłówkowym(header file) mieszczą się min definicjetypów npfile
Wykład 7 Przetwarzanie wstępne, str 5 #include program na wielu plikach Co inkludujemy, pisząc na początku programu #include<stdioh> lub #include<mathh> itp? (Na sigmie te pliki mieszczą w/usr/include/ można zajrzeć) W standardowym pliku nagłówkowym(header file) mieszczą się min definicjetypów npfile definicjestałych npeof
Wykład 7 Przetwarzanie wstępne, str 5 #include program na wielu plikach Co inkludujemy, pisząc na początku programu #include<stdioh> lub #include<mathh> itp? (Na sigmie te pliki mieszczą w/usr/include/ można zajrzeć) W standardowym pliku nagłówkowym(header file) mieszczą się min definicjetypów npfile definicjestałych npeof deklaracje zmiennych np stdout(zmienna typu FILE*, wskaźnik na plik związany z ekranem)
Wykład 7 Przetwarzanie wstępne, str 5 #include program na wielu plikach Co inkludujemy, pisząc na początku programu #include<stdioh> lub #include<mathh> itp? (Na sigmie te pliki mieszczą w/usr/include/ można zajrzeć) W standardowym pliku nagłówkowym(header file) mieszczą się min definicjetypów npfile definicjestałych npeof deklaracje zmiennych np stdout(zmienna typu FILE*, wskaźnik na plik związany z ekranem) nagłówki funkcji np printf; wyłącznie nagłówki, bez definicji!
Wykład 7 Przetwarzanie wstępne, str 5 #include program na wielu plikach Co inkludujemy, pisząc na początku programu #include<stdioh> lub #include<mathh> itp? (Na sigmie te pliki mieszczą w/usr/include/ można zajrzeć) W standardowym pliku nagłówkowym(header file) mieszczą się min definicjetypów npfile definicjestałych npeof deklaracje zmiennych np stdout(zmienna typu FILE*, wskaźnik na plik związany z ekranem) nagłówki funkcji np printf; wyłącznie nagłówki, bez definicji!
Wykład 7 Przetwarzanie wstępne, str 5 #include program na wielu plikach Co inkludujemy, pisząc na początku programu #include<stdioh> lub #include<mathh> itp? (Na sigmie te pliki mieszczą w/usr/include/ można zajrzeć) W standardowym pliku nagłówkowym(header file) mieszczą się min definicjetypów npfile definicjestałych npeof deklaracje zmiennych np stdout(zmienna typu FILE*, wskaźnik na plik związany z ekranem) nagłówki funkcji np printf; wyłącznie nagłówki, bez definicji! Np intprintf(char*format,);
Wykład 7 Przetwarzanie wstępne, str 5 #include program na wielu plikach Co inkludujemy, pisząc na początku programu #include<stdioh> lub #include<mathh> itp? (Na sigmie te pliki mieszczą w/usr/include/ można zajrzeć) W standardowym pliku nagłówkowym(header file) mieszczą się min definicjetypów npfile definicjestałych npeof deklaracje zmiennych np stdout(zmienna typu FILE*, wskaźnik na plik związany z ekranem) nagłówki funkcji np printf; wyłącznie nagłówki, bez definicji! Np intprintf(char*format,); Definicje funkcji standardowych mieszczą się w bibliotece standardowej C, a nie w pliku nagłówkowym
Wykład 7 Przetwarzanie wstępne, str 6 #include własny plik nagłówkowy
Wykład 7 Przetwarzanie wstępne, str 6 #include własny plik nagłówkowy Modularność programu ułatwia panowanie nad dużymi systemami W najprostszym przypadku:
Wykład 7 Przetwarzanie wstępne, str 6 #include własny plik nagłówkowy Modularność programu ułatwia panowanie nad dużymi systemami W najprostszym przypadku: funkcje ogólne na jednym pliku; np 1ulamki-definicjec
Wykład 7 Przetwarzanie wstępne, str 6 #include własny plik nagłówkowy Modularność programu ułatwia panowanie nad dużymi systemami W najprostszym przypadku: funkcje ogólne na jednym pliku; np 1ulamki-definicjec używający ich program główny na innym; np 1ulamki-glownyc
Wykład 7 Przetwarzanie wstępne, str 6 #include własny plik nagłówkowy Modularność programu ułatwia panowanie nad dużymi systemami W najprostszym przypadku: funkcje ogólne na jednym pliku; np 1ulamki-definicjec używający ich program główny na innym; np 1ulamki-glownyc wspólna kompilacja: gcc-wall 1ulamki-definicjec 1ulamki-glownyc
Wykład 7 Przetwarzanie wstępne, str 6 #include własny plik nagłówkowy Modularność programu ułatwia panowanie nad dużymi systemami W najprostszym przypadku: funkcje ogólne na jednym pliku; np 1ulamki-definicjec używający ich program główny na innym; np 1ulamki-glownyc wspólna kompilacja: gcc-wall 1ulamki-definicjec 1ulamki-glownyc (patrz 07-Ulamki/)
Wykład 7 Przetwarzanie wstępne, str 6 #include własny plik nagłówkowy Modularność programu ułatwia panowanie nad dużymi systemami W najprostszym przypadku: funkcje ogólne na jednym pliku; np 1ulamki-definicjec używający ich program główny na innym; np 1ulamki-glownyc wspólna kompilacja: gcc-wall 1ulamki-definicjec 1ulamki-glownyc (patrz 07-Ulamki/) gcc-wall część wspólna definicje część wspólna główny
Wykład 7 Przetwarzanie wstępne, str 7 #include własny plik nagłówkowy część wspólna gcc-wall #include"" definicje h #include"" główny
Wykład 7 Przetwarzanie wstępne, str 7 #include własny plik nagłówkowy część wspólna gcc-wall #include"" definicje h #include"" główny typy, stałe, zmienne i nagłówki funkcji; np 2ulamkih; funkcje ogólne; np 2ulamki-definicjec; używający ich program główny; np 2ulamki-glownyc; wspólna kompilacja } biblioteka
Wykład 7 Przetwarzanie wstępne, str 7 #include własny plik nagłówkowy część wspólna gcc-wall #include"" definicje h #include"" główny typy, stałe, zmienne i nagłówki funkcji; np 2ulamkih; funkcje ogólne; np 2ulamki-definicjec; używający ich program główny; np 2ulamki-glownyc; wspólna kompilacja } biblioteka
Wykład 7 Przetwarzanie wstępne, str 7 #include własny plik nagłówkowy część wspólna gcc-wall #include"" definicje h #include"" główny typy, stałe, zmienne i nagłówki funkcji; np 2ulamkih; funkcje ogólne; np 2ulamki-definicjec; używający ich program główny; np 2ulamki-glownyc; wspólna kompilacja } biblioteka
Wykład 7 Przetwarzanie wstępne, str 7 #include własny plik nagłówkowy część wspólna gcc-wall #include"" definicje h #include"" główny typy, stałe, zmienne i nagłówki funkcji; np 2ulamkih; funkcje ogólne; np 2ulamki-definicjec; używający ich program główny; np 2ulamki-glownyc; wspólna kompilacja } biblioteka
Wykład 7 Przetwarzanie wstępne, str 7 #include własny plik nagłówkowy część wspólna gcc-wall #include"" definicje h #include"" główny typy, stałe, zmienne i nagłówki funkcji; np 2ulamkih; funkcje ogólne; np 2ulamki-definicjec; używający ich program główny; np 2ulamki-glownyc; wspólna kompilacja } biblioteka
Wykład 7 Przetwarzanie wstępne, str 8 #include własny plik nagłówkowy Utrzymywanie tej samej części wspólnej w kilku różnych plikach jest niepraktyczne Dokonywanie w niej zmian wymaga zmieniania kilku plików
Wykład 7 Przetwarzanie wstępne, str 8 #include własny plik nagłówkowy Utrzymywanie tej samej części wspólnej w kilku różnych plikach jest niepraktyczne Dokonywanie w niej zmian wymaga zmieniania kilku plików
Wykład 7 Przetwarzanie wstępne, str 8 #include własny plik nagłówkowy Utrzymywanie tej samej części wspólnej w kilku różnych plikach jest niepraktyczne Dokonywanie w niej zmian wymaga zmieniania kilku plików Staramysię,żebytensamkodpisanybyłtylkoraz;albowplikuz definicjami, albo w programie głównym
Wykład 7 Przetwarzanie wstępne, str 8 #include własny plik nagłówkowy Utrzymywanie tej samej części wspólnej w kilku różnych plikach jest niepraktyczne Dokonywanie w niej zmian wymaga zmieniania kilku plików Minimum tego, co musi być znane zarówno definicjom jak programowi głównemu(definicje typów, stałych, deklaracje zmiennych, nagłówki funkcji) wynosimy do odrębnego pliku nagłówkowego
Wykład 7 Przetwarzanie wstępne, str 8 #include własny plik nagłówkowy Utrzymywanie tej samej części wspólnej w kilku różnych plikach jest niepraktyczne Dokonywanie w niej zmian wymaga zmieniania kilku plików Staramysię,żebytensamkodpisanybyłtylkoraz;albowplikuz definicjami, albo w programie głównym Minimum tego, co musi być znane zarówno definicjom jak programowi głównemu(definicje typów, stałych, deklaracje zmiennych, nagłówki funkcji) wynosimy do odrębnego pliku nagłówkowego Nazwy plików nagłówkowych tradycyjnie mają rozszerzenie h od ang header
Wykład 7 Przetwarzanie wstępne, str 8 #include własny plik nagłówkowy Utrzymywanie tej samej części wspólnej w kilku różnych plikach jest niepraktyczne Dokonywanie w niej zmian wymaga zmieniania kilku plików Staramysię,żebytensamkodpisanybyłtylkoraz;albowplikuz definicjami, albo w programie głównym Minimum tego, co musi być znane zarówno definicjom jak programowi głównemu(definicje typów, stałych, deklaracje zmiennych, nagłówki funkcji) wynosimy do odrębnego pliku nagłówkowego Nazwy plików nagłówkowych tradycyjnie mają rozszerzenie h od ang header Autor programu głównego nie musi znać treści pliku z definicjami, ale powinien znać treść pliku nagłówkowego
Wykład 7 Przetwarzanie wstępne, str 9 #define zastępowanie w programie
Wykład 7 Przetwarzanie wstępne, str 9 #define zastępowanie w programie #define ABC defg ABC ABC
Wykład 7 Przetwarzanie wstępne, str 9 #define zastępowanie w programie #define ABC defg ABC ABC defg defg
Wykład 7 Przetwarzanie wstępne, str 9 #define zastępowanie w programie #define ABC defg ABC ABC defg defg Dyrektywa #define MAKRO reszta wiersza powoduje zastąpienie wszystkich wystąpień MAKRa w programie przez resztę wiersza
Wykład 7 Przetwarzanie wstępne, str 10 #define zastępowanie w programie Przykład: (UWAŻAĆ!) M #define ILE 100; if(ile < 1000) printf("\n mniejsze\n\n"); else printf("\n niemniejsze\n\n");
Wykład 7 Przetwarzanie wstępne, str 10 #define zastępowanie w programie Przykład: (UWAŻAĆ!) M #define ILE 100; if(ile < 1000) printf("\n mniejsze\n\n"); else printf("\n niemniejsze\n\n"); sygnalizuje błąd: error: expected ) before ; token
Wykład 7 Przetwarzanie wstępne, str 10 #define zastępowanie w programie Przykład: (UWAŻAĆ!) M #define ILE 100; if(ile < 1000) printf("\n mniejsze\n\n"); else printf("\n niemniejsze\n\n"); sygnalizuje błąd: error: expected ) before ; token Wynik zastąpienia: if(100; < 1000) printf("\n mniejsze\n\n"); else printf("\n niemniejsze\n\n");
Wykład 7 Przetwarzanie wstępne, str 10 #define zastępowanie w programie Przykład: (UWAŻAĆ!) M #define ILE 100; if(ile < 1000) printf("\n mniejsze\n\n"); else printf("\n niemniejsze\n\n"); sygnalizuje błąd: error: expected ) before ; token Wynik zastąpienia: if(100; < 1000) printf("\n mniejsze\n\n"); else printf("\n niemniejsze\n\n"); Winny jest średnik
Wykład 7 Przetwarzanie wstępne, str 11 #define zastępowanie w programie Nie zastępuje się części słów
Wykład 7 Przetwarzanie wstępne, str 11 #define zastępowanie w programie Nie zastępuje się części słów; np nie będzie żadnego zastąpienia w tym przypadku: #define KOT pies BOJKOT
Wykład 7 Przetwarzanie wstępne, str 11 #define zastępowanie w programie Nie zastępuje się części słów; np nie będzie żadnego zastąpienia w tym przypadku: #define KOT pies BOJKOT Nie zastępuje się we wnętrzu cudzysłowu
Wykład 7 Przetwarzanie wstępne, str 11 #define zastępowanie w programie Nie zastępuje się części słów; np nie będzie żadnego zastąpienia w tym przypadku: #define KOT pies BOJKOT Nie zastępuje się we wnętrzu cudzysłowu; np nie będzie żadnego zastąpienia w tym przypadku: #define KOT pies printf("wlazł KOT na płot\n");
Wykład 7 Przetwarzanie wstępne, str 12 #define zastępowanie z parametrami
Wykład 7 Przetwarzanie wstępne, str 12 #define zastępowanie z parametrami Makro może mieć parametry nazwy pooddzielane przecinkami
Wykład 7 Przetwarzanie wstępne, str 12 #define zastępowanie z parametrami Makro może mieć parametry nazwy pooddzielane przecinkami Przy zastępowaniu parametry są tekstowo (czyli na ślepo, bezmyślnie ) zastępowane argumentami wywołania
Wykład 7 Przetwarzanie wstępne, str 12 #define zastępowanie z parametrami Makro może mieć parametry nazwy pooddzielane przecinkami Przy zastępowaniu parametry są tekstowo (czyli na ślepo, bezmyślnie ) zastępowane argumentami wywołania #define KWADRAT(x) x*x printf("%i\n",kwadrat(4)); printf("%2lf\n",kwadrat(12));
Wykład 7 Przetwarzanie wstępne, str 12 #define zastępowanie z parametrami Makro może mieć parametry nazwy pooddzielane przecinkami Przy zastępowaniu parametry są tekstowo (czyli na ślepo, bezmyślnie ) zastępowane argumentami wywołania #define KWADRAT(x) x*x printf("%i\n",kwadrat(4)); printf("%2lf\n",kwadrat(12)); printf("%i\n",4*4); printf("%2lf\n",12*12);
Wykład 7 Przetwarzanie wstępne, str 12 #define zastępowanie z parametrami Makro może mieć parametry nazwy pooddzielane przecinkami Przy zastępowaniu parametry są tekstowo (czyli na ślepo, bezmyślnie ) zastępowane argumentami wywołania #define KWADRAT(x) x*x printf("%i\n",kwadrat(4)); printf("%2lf\n",kwadrat(12)); printf("%i\n",4*4); printf("%2lf\n",12*12); Aletrzebauważać
Wykład 7 Przetwarzanie wstępne, str 13 #define zastępowanie z parametrami #define KWADRAT(x) x*x printf("%i\n",kwadrat(2+2)); Taka komenda drukuje 8 (zamiast 16)
Wykład 7 Przetwarzanie wstępne, str 13 #define zastępowanie z parametrami #define KWADRAT(x) x*x printf("%i\n",kwadrat(2+2)); Taka komenda drukuje 8 (zamiast 16)
Wykład 7 Przetwarzanie wstępne, str 13 #define zastępowanie z parametrami #define KWADRAT(x) x*x printf("%i\n",kwadrat(2+2)); Taka komenda drukuje 8 (zamiast 16) Wynik zastąpienia: 2+2*2+2 Lepsza definicja: #define KWADRAT(x)(x)*(x) wynik zastąpienia: (2+2)*(2+2)
Wykład 7 Przetwarzanie wstępne, str 13 #define zastępowanie z parametrami #define KWADRAT(x) x*x printf("%i\n",kwadrat(2+2)); Taka komenda drukuje 8 (zamiast 16) Wynik zastąpienia: 2+2*2+2 Lepsza definicja: #define KWADRAT(x)(x)*(x) wynik zastąpienia: (2+2)*(2+2)
Wykład 7 Przetwarzanie wstępne, str 14 #define zastępowanie z parametrami #define DLA(I, N) for(i=0; I<(N); I++)
Wykład 7 Przetwarzanie wstępne, str 14 #define zastępowanie z parametrami #definedla(i,n)for(i=0;i<(n);i++) pętlapoiod0don
Wykład 7 Przetwarzanie wstępne, str 14 #define zastępowanie z parametrami #definedla(i,n)for(i=0;i<(n);i++) pętlapoiod0don Wtedy: w=1; DLA(i,N)w=2*w; obliczapotęgęw=2 N w=1; DLA(i,N)w=w*(i+1); obliczasilnięw=n! DLA(i,n) DLA(j,k) tab[i][j] = 0; zeruje tablicę tab[n][k]
Wykład 7 Przetwarzanie wstępne, str 14 #define zastępowanie z parametrami #definedla(i,n)for(i=0;i<(n);i++) pętlapoiod0don Wtedy: w=1; DLA(i,N)w=2*w; obliczapotęgęw=2 N w=1; DLA(i,N)w=w*(i+1); obliczasilnięw=n! DLA(i,n) DLA(j,k) tab[i][j] = 0; zeruje tablicę tab[n][k]
Wykład 7 Przetwarzanie wstępne, str 14 #define zastępowanie z parametrami #definedla(i,n)for(i=0;i<(n);i++) pętlapoiod0don Wtedy: w=1; DLA(i,N)w=2*w; obliczapotęgęw=2 N w=1; DLA(i,N)w=w*(i+1); obliczasilnięw=n! DLA(i,n) DLA(j,k) tab[i][j] = 0; zeruje tablicę tab[n][k]
Wykład 7 Przetwarzanie wstępne, str 15 #define zastępowanie z parametrami UWAGA NA SPACJE!
Wykład 7 Przetwarzanie wstępne, str 15 #define zastępowanie z parametrami UWAGA NA SPACJE! #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro bez parametrów: printf("%i\n",(int)((int)06+(int)(06))); drukuje: 0 #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro z parametrem: printf("%i\n",(int)(06+06)); drukuje: 1
Wykład 7 Przetwarzanie wstępne, str 15 #define zastępowanie z parametrami UWAGA NA SPACJE! #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro bez parametrów: printf("%i\n",(int)((int)06+(int)(06))); drukuje: 0 #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro z parametrem: printf("%i\n",(int)(06+06)); drukuje: 1
Wykład 7 Przetwarzanie wstępne, str 15 #define zastępowanie z parametrami UWAGA NA SPACJE! #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro bez parametrów: printf("%i\n",(int)((int)06+(int)(06))); drukuje: 0 #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro z parametrem: printf("%i\n",(int)(06+06)); drukuje: 1
Wykład 7 Przetwarzanie wstępne, str 15 #define zastępowanie z parametrami UWAGA NA SPACJE! #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro bez parametrów: printf("%i\n",(int)((int)06+(int)(06))); drukuje: 0 #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro z parametrem: printf("%i\n",(int)(06+06)); drukuje: 1
Wykład 7 Przetwarzanie wstępne, str 15 #define zastępowanie z parametrami UWAGA NA SPACJE! #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro bez parametrów: printf("%i\n",(int)((int)06+(int)(06))); drukuje: 0 #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro z parametrem: printf("%i\n",(int)(06+06)); drukuje: 1
Wykład 7 Przetwarzanie wstępne, str 15 #define zastępowanie z parametrami UWAGA NA SPACJE! #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro bez parametrów: printf("%i\n",(int)((int)06+(int)(06))); drukuje: 0 #define ZLE(int)06+(int) printf("%i\n",(int)(zle(06))); makro z parametrem: printf("%i\n",(int)(06+06)); drukuje: 1
Wykład 7 Przetwarzanie wstępne, str 16 #define zastępowanie z parametrami Poprzedzenie parametru makra płotkiem# powoduje ujęcie argumentu w cudzysłów
Wykład 7 Przetwarzanie wstępne, str 16 #define zastępowanie z parametrami Poprzedzenie parametru makra płotkiem# powoduje ujęcie argumentu w cudzysłów: #define PYTAJ O(zmienna)\ {printf("%s==",#zmienna);scanf("%i",&zmienna); }
Wykład 7 Przetwarzanie wstępne, str 16 #define zastępowanie z parametrami Poprzedzenie parametru makra płotkiem# powoduje ujęcie argumentu w cudzysłów: #define PYTAJ O(zmienna)\ {printf("%s==",#zmienna);scanf("%i",&zmienna); } Wtedy PYTAJ O(N) rozwija się do {printf("%s==","n");scanf("%i",&n); }
Wykład 7 Przetwarzanie wstępne, str 16 #define zastępowanie z parametrami Poprzedzenie parametru makra płotkiem# powoduje ujęcie argumentu w cudzysłów: #define PYTAJ O(zmienna)\ {printf("%s==",#zmienna);scanf("%i",&zmienna); } Wtedy PYTAJ O(N) rozwija się do {printf("%s==","n");scanf("%i",&n); } idrukuje N== anastępniewczytujeliczbęcałkowitądozmiennej N
Wykład 7 Przetwarzanie wstępne, str 17 #define makra standardowe Komenda: printf(" Data:%s Czas:%s Plik:%s Wiersz:%i\n", DATE, TIME, FILE, LINE ); wydrukowała: Data: Mar 31 2013 Czas: 14:43:33 Plik: testc Wiersz: 5
Wykład 7 Przetwarzanie wstępne, str 17 #define makra standardowe Komenda: printf(" Data:%s Czas:%s Plik:%s Wiersz:%i\n", DATE, TIME, FILE, LINE ); wydrukowała: Data: Mar 31 2013 Czas: 14:43:33 Plik: testc Wiersz: 5 DATE data TIME czas(godz:min:sek) FILE przetwarzany plik LINE nrwiersza
Wykład 7 Przetwarzanie wstępne, str 17 #define makra standardowe Komenda: printf(" Data:%s Czas:%s Plik:%s Wiersz:%i\n", DATE, TIME, FILE, LINE ); wydrukowała: Data: Mar 31 2013 Czas: 14:43:33 Plik: testc Wiersz: 5 DATE data TIME czas(godz:min:sek) FILE przetwarzany plik LINE nrwiersza
Wykład 7 Przetwarzanie wstępne, str 17 #define makra standardowe Komenda: printf(" Data:%s Czas:%s Plik:%s Wiersz:%i\n", DATE, TIME, FILE, LINE ); wydrukowała: Data: Mar 31 2013 Czas: 14:43:33 Plik: testc Wiersz: 5 DATE data TIME czas(godz:min:sek) FILE przetwarzany plik LINE nrwiersza
Wykład 7 Przetwarzanie wstępne, str 17 #define makra standardowe Komenda: printf(" Data:%s Czas:%s Plik:%s Wiersz:%i\n", DATE, TIME, FILE, LINE ); wydrukowała: Data: Mar 31 2013 Czas: 14:43:33 Plik: testc Wiersz: 5 DATE data TIME czas(godz:min:sek) FILE przetwarzany plik LINE nrwiersza
Wykład 7 Przetwarzanie wstępne, str 18 #define zastosowaniemakr FILE i LINE #define BLAD WEWN\ printf("\nbladwewnetrzny");\ printf("\n Powiadom autora programu podajac:");\ printf("\n nazwepliku:%s", FILE );\ printf("\n numer wiersza:%i\n\n", LINE ); if()bladwewn
Wykład 7 Przetwarzanie wstępne, str 18 #define zastosowaniemakr FILE i LINE #define BLAD WEWN\ printf("\nbladwewnetrzny");\ printf("\n Powiadom autora programu podajac:");\ printf("\n nazwepliku:%s", FILE );\ printf("\n numer wiersza:%i\n\n", LINE ); if()bladwewn drukuje: BLAD WEWNETRZNY Powiadom autora programu podajac: nazwe pliku: testc numer wiersza: 10
Wykład 7 Przetwarzanie wstępne, str 19 #define zastępowanie z parametrami Napisy, ujęte w cudzysłowy i postawione obok siebie, zlewają się w jeden: char napis[30] ="Maly""dom"; = char napis[30] ="Maly dom";
Wykład 7 Przetwarzanie wstępne, str 19 #define zastępowanie z parametrami Napisy, ujęte w cudzysłowy i postawione obok siebie, zlewają się w jeden: char napis[30] ="Maly""dom"; = char napis[30] ="Maly dom"; #define OSTRZEGAJ JESLI(cos zle)\ if(cos zle)\ printf("ostrzezenie:"#coszle"wwierszu%i\n", LINE ); OSTRZEGAJ JESLI(a[i]==0)
Wykład 7 Przetwarzanie wstępne, str 19 #define zastępowanie z parametrami Napisy, ujęte w cudzysłowy i postawione obok siebie, zlewają się w jeden: char napis[30] ="Maly""dom"; = char napis[30] ="Maly dom"; #define OSTRZEGAJ JESLI(cos zle)\ if(cos zle)\ printf("ostrzezenie:"#coszle"wwierszu%i\n", LINE ); OSTRZEGAJ JESLI(a[i]==0) if(a[i]==0) printf("ostrzezenie:""a[i]==0"" w wierszu%i\n", 10);
Wykład 7 Przetwarzanie wstępne, str 19 #define zastępowanie z parametrami Napisy, ujęte w cudzysłowy i postawione obok siebie, zlewają się w jeden: char napis[30] ="Maly""dom"; = char napis[30] ="Maly dom"; #define OSTRZEGAJ JESLI(cos zle)\ if(cos zle)\ printf("ostrzezenie:"#coszle"wwierszu%i\n", LINE ); OSTRZEGAJ JESLI(a[i]==0) if(a[i]==0) printf("ostrzezenie:""a[i]==0"" w wierszu%i\n", 10); drukuje: OSTRZEZENIE: a[i]==0 w wierszu 10
Wykład 7 Przetwarzanie wstępne, str 20 Dziedziczenie wielostronne
Wykład 7 Przetwarzanie wstępne, str 20 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: conflicting types for punkt Jak tego uniknąć?
Wykład 7 Przetwarzanie wstępne, str 20 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: plik punkth: typedef struct { double x,y; } punkt; plik odcinekh: #include"punkth" typedef struct { punkt pocz,kon; }odcinek; plik trojkath: #include"punkth" typedef struct { punkt w1,w2,w3; }trojkat; conflicting types for punkt Jak tego uniknąć? plik geomc: #include"odcinekh" #include"trojkath" trojkattr={{0,0}, {1,0}, {0,1}};
Wykład 7 Przetwarzanie wstępne, str 20 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: plik punkth: typedef struct { double x,y; } punkt; plik odcinekh: #include"punkth" typedef struct { punkt pocz,kon; }odcinek; plik trojkath: #include"punkth" typedef struct { punkt w1,w2,w3; }trojkat; conflicting types for punkt Jak tego uniknąć? plik geomc: #include"odcinekh" #include"trojkath" trojkattr={{0,0}, {1,0}, {0,1}};
Wykład 7 Przetwarzanie wstępne, str 20 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: plik punkth: typedef struct { double x,y; } punkt; plik odcinekh: #include"punkth" typedef struct { punkt pocz,kon; }odcinek; plik trojkath: #include"punkth" typedef struct { punkt w1,w2,w3; }trojkat; conflicting types for punkt Jak tego uniknąć? plik geomc: #include"odcinekh" #include"trojkath" trojkattr={{0,0}, {1,0}, {0,1}};
Wykład 7 Przetwarzanie wstępne, str 20 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: plik punkth: typedef struct { double x,y; } punkt; plik odcinekh: #include"punkth" typedef struct { punkt pocz,kon; }odcinek; plik trojkath: #include"punkth" typedef struct { punkt w1,w2,w3; }trojkat; conflicting types for punkt Jak tego uniknąć? plik geomc: #include"odcinekh" #include"trojkath" trojkattr={{0,0}, {1,0}, {0,1}};
Wykład 7 Przetwarzanie wstępne, str 20 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: plik punkth: typedef struct { double x,y; } punkt; plik odcinekh: #include"punkth" typedef struct { punkt pocz,kon; }odcinek; plik trojkath: #include"punkth" typedef struct { punkt w1,w2,w3; }trojkat; conflicting types for punkt Jak tego uniknąć? plik geomc: #include"odcinekh" #include"trojkath" trojkattr={{0,0}, {1,0}, {0,1}};
Wykład 7 Przetwarzanie wstępne, str 21 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: conflicting types for punkt Jak tego uniknąć?
Wykład 7 Przetwarzanie wstępne, str 21 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: conflicting types for punkt Jak tego uniknąć? plik punkth: #ifndef PUNKT #define PUNKT typedef struct { double x,y; } punkt; #endif #define PUNKT definiuje makro specyficzne dla pliku punkth
Wykład 7 Przetwarzanie wstępne, str 21 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: conflicting types for punkt Jak tego uniknąć? plik punkth: #ifndef PUNKT #define PUNKT typedef struct { double x,y; } punkt; #endif #define PUNKT definiuje makro specyficzne dla pliku punkth
Wykład 7 Przetwarzanie wstępne, str 21 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: conflicting types for punkt Jak tego uniknąć? plik punkth: #ifndef PUNKT #define PUNKT typedef struct { double x,y; } punkt; #endif #define PUNKT definiuje makro specyficzne dla pliku punkth Część programu między #ifndef PUNKT a #endif jest wykonywana tylko wtedy, gdy makro PUNKT jest niezdefiniowane To się może zdarzyć tylko jeden raz
Wykład 7 Przetwarzanie wstępne, str 21 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: conflicting types for punkt Jak tego uniknąć? plik punkth: #ifndef PUNKT #define PUNKT typedef struct { double x,y; } punkt; #endif #define PUNKT definiuje makro specyficzne dla pliku punkth Część programu między #ifndef PUNKT a #endif jest wykonywana tylko wtedy, gdy makro PUNKT jest niezdefiniowane To się może zdarzyć tylko jeden raz
Wykład 7 Przetwarzanie wstępne, str 21 Dziedziczenie wielostronne Wwyniku wielostronnego dziedziczenia przez #include dojść może do wielokrotnej definicji tego samego typu Błąd: conflicting types for punkt Jak tego uniknąć? plik punkth: #ifndef PUNKT #define PUNKT typedef struct { double x,y; } punkt; #endif #define PUNKT definiuje makro specyficzne dla pliku punkth Część programu między #ifndef PUNKT a #endif jest wykonywana tylko wtedy, gdy makro PUNKT jest niezdefiniowane To się może zdarzyć tylko jeden raz Wobec tego typ punkt zostanie zdefiniowany tylko raz
Wykład 7 Przetwarzanie wstępne, str 22 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif
Wykład 7 Przetwarzanie wstępne, str 22 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif ( poprzednioomawianakonstrukcja#ifndef#endif też jest przykładem kompilacji warunkowej )
Wykład 7 Przetwarzanie wstępne, str 22 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif ( poprzednioomawianakonstrukcja#ifndef#endif też jest przykładem kompilacji warunkowej ) Te dyrektywy włączają do kompilacji fragmenty programu np w zależności od używanej maszyny lub systemu operacyjnego lub kompilatora
Wykład 7 Przetwarzanie wstępne, str 22 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif ( poprzednioomawianakonstrukcja#ifndef#endif też jest przykładem kompilacji warunkowej ) Te dyrektywy włączają do kompilacji fragmenty programu np w zależności od używanej maszyny lub systemu operacyjnego lub kompilatora, stadium uruchamiania programu wydruki testowe, ostatecznie usuwane
Wykład 7 Przetwarzanie wstępne, str 22 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif ( poprzednioomawianakonstrukcja#ifndef#endif też jest przykładem kompilacji warunkowej ) Te dyrektywy włączają do kompilacji fragmenty programu np w zależności od używanej maszyny lub systemu operacyjnego lub kompilatora, stadium uruchamiania programu wydruki testowe, ostatecznie usuwane, chwilowego wyboru wersji
Wykład 7 Przetwarzanie wstępne, str 22 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif ( poprzednioomawianakonstrukcja#ifndef#endif też jest przykładem kompilacji warunkowej ) Te dyrektywy włączają do kompilacji fragmenty programu np w zależności od używanej maszyny lub systemu operacyjnego lub kompilatora, stadium uruchamiania programu wydruki testowe, ostatecznie usuwane, chwilowego wyboru wersji, itp
Wykład 7 Przetwarzanie wstępne, str 23 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif #ifwarunek 0 program 0 #elifwarunek 1 program 1 #elifwarunek 2 program 2 #elifwarunek n program n #elseprogram n+1 #endif
Wykład 7 Przetwarzanie wstępne, str 23 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif #ifwarunek 0 program 0 #elifwarunek 1 program 1 #elifwarunek 2 program 2 #elifwarunek n program n #elseprogram n+1 #endif jeślispełnionyjestwarunek 0, tokompilowanyjesttylkoprogram 0 jeślispełnionyjestwarunek 1, tokompilowanyjesttylkoprogram 1 itd jeśli nie jest spełniony żaden z warunków, tokompilowanyjesttylkoprogram n+1
Wykład 7 Przetwarzanie wstępne, str 23 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif #ifwarunek 0 program 0 #elifwarunek 1 program 1 #elifwarunek 2 program 2 #elifwarunek n program n #elseprogram n+1 #endif jeślispełnionyjestwarunek 0, tokompilowanyjesttylkoprogram 0 jeślispełnionyjestwarunek 1, tokompilowanyjesttylkoprogram 1 itd jeśli nie jest spełniony żaden z warunków, tokompilowanyjesttylkoprogram n+1
Wykład 7 Przetwarzanie wstępne, str 23 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif #ifwarunek 0 program 0 #elifwarunek 1 program 1 #elifwarunek 2 program 2 #elifwarunek n program n #elseprogram n+1 #endif jeślispełnionyjestwarunek 0, tokompilowanyjesttylkoprogram 0 jeślispełnionyjestwarunek 1, tokompilowanyjesttylkoprogram 1 itd jeśli nie jest spełniony żaden z warunków, tokompilowanyjesttylkoprogram n+1
Wykład 7 Przetwarzanie wstępne, str 23 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif #ifwarunek 0 program 0 #elifwarunek 1 program 1 #elifwarunek 2 program 2 #elifwarunek n program n #elseprogram n+1 #endif jeślispełnionyjestwarunek 0, tokompilowanyjesttylkoprogram 0 jeślispełnionyjestwarunek 1, tokompilowanyjesttylkoprogram 1 itd jeśli nie jest spełniony żaden z warunków, tokompilowanyjesttylkoprogram n+1 Niekompilowanie niepotrzebnego kodu daje oszczędność pamięci
Wykład 7 Przetwarzanie wstępne, str 24 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif Przykład: M(Patrz 07-Sortowanie/)
Wykład 7 Przetwarzanie wstępne, str 24 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif Przykład: M(Patrz 07-Sortowanie/) W pliku sorth można wybrać jeden z algorytmów: #define BUBBLE //#define INSERTION //#definemerge
Wykład 7 Przetwarzanie wstępne, str 24 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif Przykład: M(Patrz 07-Sortowanie/) W pliku sorth można wybrać jeden z algorytmów: #define BUBBLE //#define INSERTION //#definemerge Wpliku sortc temuwyborowi odpowiada kompilacja warunkowa:
Wykład 7 Przetwarzanie wstępne, str 24 Kompilacja warunkowa dyrektywy#if,#else,#elif,#endif Przykład: M(Patrz 07-Sortowanie/) W pliku sorth można wybrać jeden z algorytmów: #define BUBBLE //#define INSERTION //#definemerge Wpliku sortc temuwyborowi odpowiada kompilacja warunkowa: #if defined BUBBLE void sort(double tab[wlk TABLICY]) { sortowaniebąbelkowe } #elif defined INSERTION void sort(double tab[wlk TABLICY]) { sortowanieprzezwstawianie } #elif defined MERGE void sort(double tab[wlk TABLICY]) { sortowanieprzezscalanie } #else #error"nieznany algorytm sortowania" #endif
Wykład 7 Przetwarzanie wstępne, str 25 Jak automatycznie uzyskać wynik preprocessingu?
Wykład 7 Przetwarzanie wstępne, str 25 Jak automatycznie uzyskać wynik preprocessingu? Komenda gcc-e-ccplikzdyrektywami dokonuje przetwarzania wstępnego i niczego więcej; i drukuje tekst z rozwiniętymi dyrektywami
Wykład 7 Przetwarzanie wstępne, str 25 Jak automatycznie uzyskać wynik preprocessingu? Komenda gcc-e-ccplikzdyrektywami dokonuje przetwarzania wstępnego i niczego więcej; i drukuje tekst z rozwiniętymi dyrektywami: #define mleka piwa #define tego ten #define szczescie zly los #define czeka wykiwa Kto wypije mleka, tego szczescie czeka Kto wypije mleka, tego szczescie czeka
Wykład 7 Przetwarzanie wstępne, str 25 Jak automatycznie uzyskać wynik preprocessingu? Komenda gcc-e-ccplikzdyrektywami dokonuje przetwarzania wstępnego i niczego więcej; i drukuje tekst z rozwiniętymi dyrektywami: #define mleka piwa #define tego ten #define szczescie zly los #define czeka wykiwa Kto wypije mleka, tego szczescie czeka Kto wypije piwa, ten zly los wykiwa