Jazyk C - príkazy preprocesora: Rozdiel medzi revíziami
d (→Zdroje) |
|||
Riadok 158: | Riadok 158: | ||
Uvedené makrá slúžia pre výpočet objemu príslušných geometrických telies. Identifikátory v hlavičke makra a, v, p, r predstavujú formálne parametre, ktoré sú pri vyvolaní makra textovo nahradené skutočnými. Počet formálnych a skutočných parametrov musí byť rovnaký. Poradie vykonávania jednotlivých operácií v rámci makra možno riadiť zátvorkami. | Uvedené makrá slúžia pre výpočet objemu príslušných geometrických telies. Identifikátory v hlavičke makra a, v, p, r predstavujú formálne parametre, ktoré sú pri vyvolaní makra textovo nahradené skutočnými. Počet formálnych a skutočných parametrov musí byť rovnaký. Poradie vykonávania jednotlivých operácií v rámci makra možno riadiť zátvorkami. | ||
− | == | + | ==Referencie== |
Verzia zo dňa a času 12:05, 11. máj 2020
Učebné texty
Príkazy preprocesora [1]
Príkazy preprocesora umožňujú vkladanie a skladanie textu z rôznych súborov, podmienený preklad a definíciu symbolických konštánt a makier. Každý príkaz pre preprocesor sa začína znakom #, za ktorým nasleduje príkaz a jeho parametre.
V nasledujúcej časti sú vymenované všetky dôležité makrá.
Makro | Popis | |
---|---|---|
1 | #define | Definuje makro procesora. |
2 | #include | Vloží konkrétnu hlavičku z iného súboru. |
3 | #undef | Zruší definiciu makra predprocesora. |
4 | #ifdef | Vráti true, ak je toto makro definované. |
5 | #ifndef | Vráti true, ak toto makro nie je definované. |
6 | #if | Testuje, či je splnená podmienka. |
7 | #else | Vykoná sa ak neplatí podmienka if. |
8 | #elif | Vykoná sa ak neplatí podmienka if a zároveň obsahuje ďalšiu podmienku. |
9 | #endif | Ukončí podmieneneneho spracovania (použiva sa len s if ). |
10 | #error | Vypíše chybové hlásenie na stderr. |
11 | #pragma | Vydáva špeciálne príkazy kompilátoru pomocou štandardizovanej metódy. |
Definícia symbolických konštánt a makier [2]
Príkaz na definíciu symbolických konštánt má tvar:
#define NAME konštantný_výraz
Kde NAME je názov symbolickej konštanty a konštantný_výraz je hodnota, ktorú symbolická konštanta nadobúda. Príklad symbolickej konštanty:
#define MAX 100
#define LINE 80
#define PI 3.14
#define NAME1 Pavel
#define NAME2 "Peter"
Prvé tri sú číselné symbolické konštanty. MAX nadobudne hodnotu 100, LINE hodnotu 80, PI 3,14. NAME1 je znaková konštanta s hodnotou Pavel (všade namiesto NAME1 sa dosadí Pavel), NAME2 je reťazec "Peter". Symbolické konštanty sa používajú napríklad na definovanie polí z konštantnou veľkostnou napr:
#define M 10
#define N 5
...
int a[M];
float b[N], c[M][N];
char d[M+1];
Vkladanie textu
Príkaz na vkladanie textu #include [meno súboru] spôsobí vloženie obsahu súboru "meno súboru" pred prekladom do zdrojového súboru, v ktorom sa vyššie uvedený príkaz nachádza. To umožňuje vkladanie tak systémových súborov (tzv. hlavičkových súborov, s príponou .h, napr. <stdio.h>), ako aj vlastných užívateľských súborov, čo predstavuje jednu z možností modulárnej výstavby programu.Príkaz na vloženie môže mať dva tvary (v prvom prípade je názov súboru uvedený v lomených zátvorkách, v druhom prípade v dvojitých úvodzovkách):
#include <file.h>
#include "path_file"
Prvý tvar sa používa pre vkladanie systémových súborov, ktoré sú uložené v príslušnom systémovom podadresári (INCLUDE).Všetky štandardné funkcie, konštanty a makrá v jazyku C sú deklasované v takýchto súboroch. Pri popise danej funkcie je vždy uvedená adresár v ktorom sa daná funkcia nachádza. Vloženie daného súboru umožňuje kompilátoru kontrolu správnosti volania štandardnej funkcie. Druhý tvar sa používa pre vkladanie užívateľských súborov, pričom sa prehľadáva aktuálny adresár, resp. adresár, uvedený v špecifikácii vkladaného súboru.
Podmienený preklad
Príkazy pre podmienený preklad majú tvar:
#undef FILE_SIZE
#define FILE_SIZE 42
Tieto príkazy povedia preprocesoru aby nedefinoval existujúci FILE_SIZE a definuj ho ako FILE_SIZE z hodnotou 42.
#ifndef SPRAVA
#define SPRAVA "Čo potrebuješ?"
#endif
Povie CPP, aby definoval SPRAVA , iba ak SPRAVA ešte nie je definovaná. Každý z príkazov #if, #ifdef, resp. #ifndef musí byť ukončený príkazom #endif.
Preddefinované makrá
ANSI C definuje niekoľko makier. Aj keď je každé z nich k dispozícii na použitie v programovaní, preddefinované makrá by sa nemali priamo upravovať.
Makro | popis | |
---|---|---|
1 | __DÁTUM__ | Aktuálny dátum ako znakový literál vo formáte „MMM DD RRRR“. |
2 | __TIME__ | Aktuálny čas ako znakový literál vo formáte „HH: MM: SS“. |
3 | __FILE__ | Toto obsahuje aktuálny názov súboru ako reťazcový literál. |
4 | __LINE__ | Toto obsahuje aktuálne číslo riadku ako desatinnú konštantu. |
5 | __STDC__ | Definovaný ako 1, keď kompilátor vyhovuje štandardu ANSI. |
Vyskúšajte nasledujúci príklad -
#include <stdio.h>
int main() {
printf("File :%s\n", __FILE__ );
printf("Date :%s\n", __DATE__ );
printf("Time :%s\n", __TIME__ );
printf("Line :%d\n", __LINE__ );
printf("ANSI :%d\n", __STDC__ );
}
Po skompilovaní a spustení vyššie uvedeného kódu v súbore test.c sa získa nasledujúci výsledok -
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
Parametrizované makrá
Na výpočet obsahu štvorca môžeme použiť napr. nasledovnú funkciu:
int štvorec(int x) {
return x * x;
}
Táto funkcia nám načíta rozmer štvorca x a vráti nám jeho obsah. Avšak túto funkciu môžme nahradiť nasledovným makrom:
#define štvorec(x) (x*x)
Definícia makra spočíva v pridaní jedného či viacerých parametrov k názvu symbolickej konštanty (symbolickú konštantu je možné pokladať za makro bez parametrov) a doplnení výrazu pre jeho výpočet napr:
#define KOCKA(a) (a*a*a)
#define VALEC(v,p) (PI*p*p*v)
#define GULA(r) (4*PI/3*r*r*r)
Uvedené makrá slúžia pre výpočet objemu príslušných geometrických telies. Identifikátory v hlavičke makra a, v, p, r predstavujú formálne parametre, ktoré sú pri vyvolaní makra textovo nahradené skutočnými. Počet formálnych a skutočných parametrov musí byť rovnaký. Poradie vykonávania jednotlivých operácií v rámci makra možno riadiť zátvorkami.