Makrá

Obsah kapitoly:

 Makrá bez parametrov (symbolické konštanty)

Keď sa vo vašom programe nachádza nejaká konštanta, ktorá sa často opakuje, tak je vhodné dať jej symbolické meno a v programe používať toto meno. Výhodnosť tejto zámeny pochopíte z príkladu, ktorý uvediem za chvíľu (po reklame). Teraz si ukážeme, ako si takéto makro vytvoríte (zadefinujete).

  #define MAX 1000

Vydíte, že na definovanie makra sa používa príkaz #define, potom nasleduje medzera, za ňou meno makra (v našom príp. MAX), potom ďalšia medzera a za ňou hodnota makra (v našom príp. 1000). Definícia makra nie je ukončená bodkočiarkou a ich mená píšeme z konvencie veľkými písmenami. Ďalšie definície makier:

  #define MIN 10
  #define PI 3.14
  #define AND &&

Zoberme si naše prvé makro MAX. Všade v programe, kde ste chceli použiť konštantu 1000 môžte teraz použiť symbolickú konštantu MAX. Keď dáte program spracovať, tak všetky symbolické konštanty MAX preprocesor nahradí konštantou 1000. Niekto by sa mohol opítať prečo rovno nepísať 1000? Teraz si ukážme výhodnosť použitia MAX. Predstavte si, že máte program, ktorý má 10 000 riadkov a na 100 rôznych miestach v tomto programe sa vyskytuje konštanta 1000. Pri ladení programu sa rozhodnete, že hodnotu 1000 treba všade zmeniť na hodnotu 900. Môžete začať prehľadávať celý program a všade prepisovať 1000 na 900. Veľmi blbá robota. A výsledok? Zistíte, že ste vynechali zo 2-3 miesta a môžete hľadať kde. Ešte blbšia robota. Niektorý už možno tušíte ako nám makro neuveriteľne zjednoduší robotu. V nasledujúcom programe som si zadefinoval makro MAX a používal ho namiesto konštanty 1000.

Príklad 3: Dajme tomu, že program dokáže rozšifrovať ľubovolný textový súbor, ale inak len ukazuje výhodnosť použitia makier.

      #include <stdio.h>
      #define MAX 1000       //Tu stačí zmeniť 1000 na 900 a problém s prepisovaním je vyriešený.
      main()
      {
          int i, j, k, l, m, n;
          for(i = 0; i < MAX; i++)
          {
              printf(“Toto je úžasný program “);
          }
          ……
          ……..
          …….       //Bodky znamenajú zvyšok programu (10 000 riadkov) v ktorom je
          ………..    //na miestach, kde mala byť konštanta 1000, použitá symbolická
          ……       // konštanta MAX.
          ……
          return(0);
      }

Myslím, že výhodnosť použitia makier bez parametrov by mohla byť pomaly jasná. Pozrime sa teraz na makrá s parametrami.



 Makrá s parametrami (vkladané funkcie – in line functions)

Hneď na úvod definícia:

  #define mocnina(x) ((x)*(x))

Začíname opäť príkazom #define, potom medzera, za ňou meno makra s parametrami v okrúhlich zátvorkách mocnina(x), opäť medzera a nakoniec nejaký výraz ((x)*(x)). Volanie makra v programe bude vyzerať takto:

  z = mocnina(a);
  alebo takto:
  z = mocnina(a + b);
  alebo nejak inak (podľa potreby):

V prvom prípade sa do premennej z uloží druhá mocnina a teda z = a*a. V druhom prípade sa do premennej z uloží druhá mocnina výrazu (a + b) teda z = (a + b) * (a + b). Možno ste už sami prišli na to prečo je vo výraze ((x)*(x)) parameter x pri každom použití osobitne uzavretý v okrúhlich zátvorkách. Ak nie tak nasledujúci príklad by vám to mal objasniť. Zadefinujme si makro ešte raz, ale vo výraze neuzavrime x do osobitných zátvoriek.

  #define mocnina(x) (x*x)

  Po volaní makra:
  z = mocnina(a + b);
  sa makro rozvinie do takejto podoby:
  z = a + b * a + b
  čo sa odlišuje od predošlého prípadu so zátvorkami kedy sa makro rozvinulo do podoby:
  z = (a + b) * (a + b).

Z matematiky viete, že výsledky posledných dvoch výrazov budú odlišné, teda v programe dôjde k chybe.


predošlá kapitola       ďalšia kapitola

hore

späť

domov


© Roman Kukučka