10. Preprocesor II
  1. Preprocesor umo╛≥uje provßd∞t takΘ podmφn∞n² p°eklad Φßstφ zdrojovΘho k≤du programu. Podmφn∞nΘ direktivy (#if, #ifdef, #ifndef, #else, #elif a #endif) urΦujφ, kterß Φßst textu zdrojovΘho programu bude p°eklßdßna. Nejd∙le╛it∞j╣φ pou╛itφ t∞chto direktiv je zaji╣t∞nφ p°ekladu sprßvn²ch Φßstφ programu v p°φpad∞, kdy program je urΦen pro n∞kolik r∙zn²ch prost°edφ (nap°. pro DOS nebo Windows) nebo v p°φpad∞, kdy zdrojov² text bude pou╛φvßn v programu zapsanΘm v jazyku C nebo C++ (nap°. jeden hlaviΦkov² soubor budeme n∞kdy pou╛φvat v C a jindy v C++). M∙╛eme je takΘ pou╛φt k zaji╣t∞nφ toho, aby jeden hlaviΦkov² soubor nebyl do jednoho programu vlo╛en vφcekrßt.

  2. Na tuto poslednφ mo╛nost se podφvßme podrobn∞ji. Kdy╛ se podφvßme na prßzdn² hlaviΦkov² soubor n∞jakΘho formulß°e (zaΦneme s v²vojem novΘ aplikace GUI, p°ejdeme do editoru k≤du a v mφstnφ nabφdce editoru zvolφme Open Source/Header File) pak vidφme tento text:
    //---------------------------------------------------------------------------
    #ifndef Unit1H        // zji╣t∞nφ, zda je definovßn symbol Unit1H
    #define Unit1H        // definice symbolu Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
    private: // User declarations
    public:  // User declarations
        __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif                // konec podmφn∞nΘho p°ekladu
    V tomto textu je zaji╣t∞no, aby nemohl b²t podruhΘ vlo╛en hlaviΦkov² soubor do stejnΘho programu (pomocφ deklarace symbolu - makra odpovφdajφcφho jmΘnu souboru). Pokuste se pochopit jak pou╛itΘ direktivy pracujφ.
  3. Direktiva #pragma umo╛≥uje zavßd∞t direktivy specifickΘ pro danou implementaci (r∙znΘ p°ekladaΦe mohou mφt r∙znΘ direktivy). Direktiva, kterß nenφ v danΘm p°ekladaΦi podporovßna je p°ekladaΦem ignorovßna.

  4. Pokud si prohlΘdneme n∞kter² z ji╛ vytvo°en²ch program∙, pak nalezneme direktivu
    #pragma hdrstop
    Tato direktiva ukonΦuje seznam hlaviΦkov²ch soubor∙, kterΘ budou p°edp°elo╛eny. P°ed touto direktivou jsou vklßdßny hlaviΦkovΘ soubory, kterΘ se nem∞nφ a je tedy mo╛no je p°elo╛it pouze jednou. Tφm je mo╛no zkrßtit dobu dal╣φch p°eklad∙ aplikace.
    C++ Builder definuje je╣t∞ n∞kolik takov²chto direktiv.
  5. HlaviΦkov² soubor math.h obsahuje definice r∙zn²ch matematick²ch funkcφ. Jsou zde nap°. definovßny funkce: acos (arkus kosinus), asin (arkus sinus), atan (arkus tangens), ceil (zaokrouhlovßnφ nahoru), cos (kosinus), cosh (hyperbolick² kosinus), exp (exponencißlnφ funkce), floor (zaokrouhlovßnφ dolu), log (p°irozen² logaritmus), log10 (dekadick² logaritmus), poly (hodnota polynomu), pow (xy), sin (sinus), sinh (hyperbolick² sinus), sqrt (druhß odmocnina), tan (tangens) a tanh (hyperbolick² tangens).Pomocφ nßpov∞dy se seznamte nap°. s funkcφ pow. Vyzkou╣ejte si vzorov² p°φklad z nßpov∞dy.
  6. Nßsledujφcφ konzolovß aplikace ukazuje pou╛itφ parametr∙ funkce main k p°edßvßnφ parametr∙ p°φkazovΘho °ßdku. Vyzkou╣ejte ji s r∙zn²mi parametry. V integrovanΘm prost°edφ C++ Builderu m∙╛eme parametry p°φkazovΘho °ßdku zadßvat v dialogovΘm okn∞ zobrazenΘm po volb∞ Run | Parameters. Co urΦuje parametr s indexem 0? Jak je nutno zadßvat parametry obsahujφcφ mezery?

  7. int main(int argc, char **argv)
    {
      int i;
      cout << argc << endl;
      for (i = 0; i < argc; i++)
        cout << "Parametr " << i << ": " << argv[i] << endl;
      getch();
      return 0;
    }
  8. Nßsledujφcφ konzolovß aplikace obsahuje funkci kopφrujφcφ znaky z klßvesnice na obrazovku a poΦφtajφcφ jejich poΦet. UkonΦujφcφ znak je znak teΦky. Je to prvnφ program, ve kterΘm jsme vytvo°ili svoji funkci (vφce o deklaracφch a definicφch funkcφ se dozvφme v nßsledujφcφ kapitole).

  9. int copy(void)
    {
      char c;
      int pocet = 0;
      while ((c = getchar()) != '.') {
        cout << c;
        pocet++;
      }
      cout << c;       // vypφ╣e se teΦka
      cout << endl;
      return pocet;
    }

    int main(int argc, char **argv)
    {
      cout << "Napi╣ v∞tu ukonΦenou teΦkou:" << endl;
      cout << "PoΦet znak∙ = " << copy() << endl;
      getch();
      return 0;
    }
    Program vyzkou╣ejte. Upravte funkci copy tak, aby (mimo kopφrovßnφ znak∙) poΦφtala pouze znaky mezer.


  10. Pomocφ voleb Run | Trace Into a Run | Step Over m∙╛eme provßd∞t nß╣ program po jednotliv²ch °ßdcφch. Vyzkou╣ejte. Pokuste se zjistit jak² je rozdφl mezi t∞mito volbami. Pomocφ t∞chto voleb (trasovßnφ programu) m∙╛eme zjistit, zda p°φkazy programu se provßd∞jφ v tom po°adφ, ve kterΘm oΦekßvßme.
  11. Trasovßnφ programu nßm m∙╛e pomoci p°i lad∞nφ program∙ (zji╣╗ovßnφ, zda program pracuje sprßvn∞). Dal╣φ pomocφ by bylo, kdybychom si mohli zjistit hodnoty n∞kter²ch prom∞nn²ch a mohli sledovat, zda tyto hodnoty se sprßvn∞ m∞nφ. Toto m∙╛eme snadno provΘst. Volbou Run | Add Watch p°idßme do sledovacφho okna prom∞nnΘ, kterΘ nßs zajφmajφ a p°i trasovßnφ programu se ve sledovacφm okn∞ tyto prom∞nnΘ zobrazujφ i s jejich aktußlnφmi hodnotami. Vyzkou╣ejte pro p°edchozφ konzolovou aplikaci pro prom∞nnΘ c a pocet.

NovΘ pojmy:

10. Preprocesor II