Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní parametrů hodnotou Oblast platnosti a paměťové třídy Oddělený překlad Speciální direktivy preprocesoru Typové modifikátory Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní parametrů hodnotou Oblast platnosti a paměťové třídy Oddělený překlad Speciální direktivy preprocesoru Typové modifikátory
Princip preprocesoringu /* vlo ž ení soubor ů */ #include /*systém*/ #include "makra.h" /*vlastní*/ void main(){ /* vlo ž ení souboru */ #include "deklarace.c" /* vyu ž ití konstant */ a = KONSTA; b = KONSTB; /* volání makra */ printf("%d", VETSI(a,b)); } /* vlo ž ení soubor ů */ #include /*systém*/ #include "makra.h" /*vlastní*/ void main(){ /* vlo ž ení souboru */ #include "deklarace.c" /* vyu ž ití konstant */ a = KONSTA; b = KONSTB; /* volání makra */ printf("%d", VETSI(a,b)); } /* definice konstant */ #define KONSTA 10 #define KONSTB 20 /* definice makra */ #define VETSI(x,y)\ ((x)>(y))?(x):(y) /* definice konstant */ #define KONSTA 10 #define KONSTB 20 /* definice makra */ #define VETSI(x,y)\ ((x)>(y))?(x):(y) int a, b; Preprocesor … int printf(const char *,...); … void main(){ int a, b; a = 10; b = 20; printf("%d", ((a)>(b))?(a):(b)); } … int printf(const char *,...); … void main(){ int a, b; a = 10; b = 20; printf("%d", ((a)>(b))?(a):(b)); } makra.h hlavni.c stdio.h math.h deklarace.c string.h memory.h math.h …
Direktivy preprocesoru … void main(){ unsigned int a, b; a = pow((double)27,1./3); b = pow((double)9*3,1./1+2); printf("a=%d,b=%d\n",a,b); if (1 <= (a) && (a) <= 10) printf("JMENO %d", 1990); } … void main(){ unsigned int a, b; a = pow((double)27,1./3); b = pow((double)9*3,1./1+2); printf("a=%d,b=%d\n",a,b); if (1 <= (a) && (a) <= 10) printf("JMENO %d", 1990); } #include #define ODMOCNINAN(x,n)\ pow((double)x,1./n) void main(){ UINT a, b; a = ODMOCNINAN(27,3); b = ODMOCNINAN(9*3,1+2); printf("a=%d,b=%d\n",a,b); if INTERVAL(a,1,10) printf("JMENO %d", ROK); } #include #define ODMOCNINAN(x,n)\ pow((double)x,1./n) void main(){ UINT a, b; a = ODMOCNINAN(27,3); b = ODMOCNINAN(9*3,1+2); printf("a=%d,b=%d\n",a,b); if INTERVAL(a,1,10) printf("JMENO %d", ROK); } Vkládaní souborů #include #include ".\\cesta\\muj.h" Definice maker bez parametrů #define ROK 1990 #define JMENO "Petr" #define UINT unsigned int Definice maker s parametry #define MINNULA(x)\ ((x)<0)? 0 :(x) #define ODMOCNINAN(x,n)\ pow((double)(x),1./(n)) #define INTERVAL(x,OD,DO)\ (OD <= (x) && (x) <= DO) #undef ODMOCNINAN
Podmíněný překlad Direktivy pro podmíněný překlad #define, #if, #else, #error … #define, #ifdef, #ifndef,… Direktivy pro podmíněný překlad #define, #if, #else, #error … #define, #ifdef, #ifndef,… #define JAZYK 1 #if JAZYK == 1 #define NAZEV "Muj Obchod" #elif JAZYK == 2 #define NAZEV "My Shop" #else #error JAZYK není nastaven #endif #define JAZYK 1 #if JAZYK == 1 #define NAZEV "Muj Obchod" #elif JAZYK == 2 #define NAZEV "My Shop" #else #error JAZYK není nastaven #endif #include void main() { printf(NAZEV); } … void main() { printf("Muj Obchod"); } #ifndef _ZNAKY_ #define _ZNAKY_ #define MAL(Z) ((Z)>='a'&&(Z)<='z') #define VEL(Z) ((Z)>='A'&&(Z)<='Z') #define POS ('a'-'A') #define NAVEL(Z) (MAL(Z))?(Z-POS):Z #define NAMAL(Z) (VEL(Z))?(Z+POS):Z #endif #ifndef _ZNAKY_ #define _ZNAKY_ #define MAL(Z) ((Z)>='a'&&(Z)<='z') #define VEL(Z) ((Z)>='A'&&(Z)<='Z') #define POS ('a'-'A') #define NAVEL(Z) (MAL(Z))?(Z-POS):Z #define NAMAL(Z) (VEL(Z))?(Z+POS):Z #endif znaky.h #include #include "znaky.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) putchar(NAVEL(zn)); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } #include #include "znaky.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) putchar(NAVEL(zn)); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } hlavni.c #define _DEF_ … #ifdef _DEF_ … #ifndef _DEF_ … #include "znaky.h" #define PISMALYZNAK(znak)\ putchar(NAMAL(znak)) #include "znaky.h" #define PISMALYZNAK(znak)\ putchar(NAMAL(znak)) mujio.h #include #include "znaky.h" #include "mujio.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) PISMALYZNAK(zn); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } #include #include "znaky.h" #include "mujio.h" void main(){ int zn; do { zn = getchar(); if (MAL(zn)) PISMALYZNAK(zn); else if (VEL(zn)) putchar(NAMAL(zn)); else putchar(zn); } while (zn != '\n'); } hlavni.c
Základy tvorby funkcí #include int secti(int, int); void main(){ int v, cislo = 7; v = secti(cislo, 10); printf("%d\n", v); } int secti(int a, int b){ return a+b; } rtyp jméno( [typ par1] [,typ par2] [,…] ) { … return [(rtyp)hodnota]; } rtyp jméno( [typ par1] [,typ par2] [,…] ) { … return [(rtyp)hodnota]; } Definice void funkceA(int parametr){ … } long funkceB(int parametr){ long hodnota; … return hodnota; } int funkceC(){ int hodnota; … return hodnota; } [rtyp prom;] [prom =] jméno([pr1][,pr2][,…]); [rtyp prom;] [prom =] jméno([pr1][,pr2][,…]); Deklarace void funkceA(int parametr); long funkceB(int); int funkceC();
int secti(int a, int b); void main(){ int v, cislo = 7; v = secti(cislo, 10); printf("%d\n", v); } int secti(int a, int b){ int ret = a + b; return ret; } Zjednodušený popis principu předávaní parametrů hodnotou … ?? 7 7 ?? (v) 7 (cislo) ?? 0x x0123 (adr) ?? (return) 10 (par. a) 7 (par. b) (ret) 17 (return) 17 (v) 17 (return) 17 (v) int secti(int a, int b); void main(){ int v, cislo = 7; v = secti(cislo, 10); printf("%d\n", v); } int secti(int a, int b){ int ret = a + b; return ret; } … Zásobník 0x0000 0xFFFF
Rekurzivní funkce #include double faktorial( int cislo) { if (cislo == 1 || cislo == 0) return 1; else return cislo * faktorial(--cislo); /*rekurze*/ } void main(){ int cislo; double f = 0; printf("Faktorial\n==========\n"); printf("Zadej cislo: "); scanf("%d",&cislo); printf("%d! = %.0lf\n(%G)\n", cislo,f,f = faktorial(cislo)); } #include double faktorial( int cislo) { if (cislo == 1 || cislo == 0) return 1; else return cislo * faktorial(--cislo); /*rekurze*/ } void main(){ int cislo; double f = 0; printf("Faktorial\n==========\n"); printf("Zadej cislo: "); scanf("%d",&cislo); printf("%d! = %.0lf\n(%G)\n", cislo,f,f = faktorial(cislo)); }
extern & static Globální Lokální Oblast platnosti a paměťové třídy auto static register auto static register Globální & Lokální int global; void funkce(){ int lokal = 11; global = 22; } void main(){ int v; funkce(); v = lokal * 2; v = global * 2; printf("%d",v); } auto & static & register int funkce(){ static int a = 1; auto int b = 1; a++,b++; return a*b; } void main(){ register int i,v; for(i=1;i<5;i++){ v = funkce(); printf("%d ",v); }} extern static extern static extern int gbA; static int gbB; int fc(){ gbA++; gbB++; return gbA+gbB; } int gbA; int fc(); static int gbB; void main(){ gbA = 10; gbB = 20; printf("%d",fc()); } Hlavni.c Funkce.c
Typové modifikátory void fc(const char *text, int n){ const int pocet = n*3; printf("%d. %s", pocet, text); } void main() { const unsigned char ne = 3; const double e = ; int pole[ne]; fc("Dnes je p ř ednáška",1); ne = 6; } void fc(const char *text, int n){ const int pocet = n*3; printf("%d. %s", pocet, text); } void main() { const unsigned char ne = 3; const double e = ; int pole[ne]; fc("Dnes je p ř ednáška",1); ne = 6; } const volatile char hodnota; void irq(){ hodnota++; } void main(){ … if(hodnota < 1) sleep(100); … } volatile char hodnota; void irq(){ hodnota++; } void main(){ … if(hodnota < 1) sleep(100); … } volatile
Oddělený překlad int fca(int a) { return 2*a; } #include "FnA.c" #include "FnB.c" void main(){ int a = fca(10); int b = fcb(20); } Hlavni.c FnA.c int fcb(int b) { return b/2; } FnB.c Hlavni.obj int fca(int a) { return 2*a; } #include "FnA.h" #include "FnB.h" void main(){ int a = fca(10); int b = fcb(20); } FnA.c int fcb(int b) { return b/2; } FnB.c Hlavni.objFnA.objFnB.obj int fca(int); FnA.h int fcb(int); FnB.h Hlavni.c
Speciální direktivy preprocesoru #define TISKTEXT(T)\ printf("%s",#T) #define PROM(C) prom##C #define CHYBA(T) \ {printf( "CHYBA \t\"%s\"\n" \ "\tRadek %d\n" \ "\tSoubor(%s)\n", \ T, __LINE__, __FILE__ );} void main(){ int PROM(A) = 1, PROM(B) = 2; TISKTEXT(ahoj jak se mas); printf("%d\n",promA); printf("%d\n",PROM(B)); CHYBA("Soubor nebyl nalezen"); } void main(){ int PROM(A) = 1, PROM(B) = 2; TISKTEXT(ahoj jak se mas); printf("%d\n",promA); printf("%d\n",PROM(B)); CHYBA("Soubor nebyl nalezen"); } #line 151 "soubor.c" __LINE__ __FILE__ __DATE__ __TIME__ #pragma … # ##
Příklad #ifndef _KVADRO_ #define _KVADRO_ #define REALRESULT 1 #define IMGRESULT 2 int kvadro( double, double, double ); extern double rex1,rex2,imx1,imx2; #endif #ifndef _KVADRO_ #define _KVADRO_ #define REALRESULT 1 #define IMGRESULT 2 int kvadro( double, double, double ); extern double rex1,rex2,imx1,imx2; #endif funkce.h #include #include " funkce.h " int kvadro( double a, double b, double c){ double D = b*b - 4*a*c; if (D<0.){ rex2 = rex1 = -b/(2*a); imx2 = -(imx1=sqrt(fabs(D))/(2*a)); return IMGRESULT; } else { rex1 = (-b + sqrt(D))/(2*a); rex2 = (-b - sqrt(D))/(2*a); return REALRESULT;}} #include #include " funkce.h " int kvadro( double a, double b, double c){ double D = b*b - 4*a*c; if (D<0.){ rex2 = rex1 = -b/(2*a); imx2 = -(imx1=sqrt(fabs(D))/(2*a)); return IMGRESULT; } else { rex1 = (-b + sqrt(D))/(2*a); rex2 = (-b - sqrt(D))/(2*a); return REALRESULT;}} funkce.c #include #include " funkce.h " double rex1,rex2,imx1,imx2; void main(){ double a,b,c; printf("Kvadraticka rovnice\n" "===================\n"); printf("Zadej koeficienty a, b, c:"); scanf("%lf,%lf,%lf",&a,&b,&c); switch (kvadro(a,b,c)){ case REALRESULT: printf("x1 = %8.2lf\n",rex1); printf("x2 = %8.2lf\n",rex2); break ; case IMGRESULT: printf("x1=%.2f%+.2fj\n",rex1,imx1); printf("x2=%.2f%+.2fj\n",rex2,imx2); break ; } #include #include " funkce.h " double rex1,rex2,imx1,imx2; void main(){ double a,b,c; printf("Kvadraticka rovnice\n" "===================\n"); printf("Zadej koeficienty a, b, c:"); scanf("%lf,%lf,%lf",&a,&b,&c); switch (kvadro(a,b,c)){ case REALRESULT: printf("x1 = %8.2lf\n",rex1); printf("x2 = %8.2lf\n",rex2); break ; case IMGRESULT: printf("x1=%.2f%+.2fj\n",rex1,imx1); printf("x2=%.2f%+.2fj\n",rex2,imx2); break ; } hlavni.c