Studijní materiály
EXTRA Kontakt

Makra v jazyce C

V jazyce C se makra používají k definování textových zástupců nebo k vytváření zkrácených funkcí, které se používají opakovaně. Makra jsou definována pomocí předkompilačního příkazu #define. Tento příkaz nahrazuje všechny výskyty zástupce jeho definice ve zdrojovém kódu před samotným překladem.

Definice makra

Syntaxe pro definici makra v jazyce C je následující:

#define NAZEV_MAKRA hodnota
      

Kde NAZEV_MAKRA je jméno makra a hodnota je text nebo výraz, který makro nahradí.

Příklad definice makra

Následující příklad definuje makro pro maximální z dvou čísel:

#include <stdio.h>
      
      #define MAX(a, b) ((a) > (b) ? (a) : (b))
      
      int main() {
          int x = 5, y = 10;
          printf("Maximum z %d a %d je %d\n", x, y, MAX(x, y));
          return 0;
      }
      

Po překladu bude příkaz MAX(x, y) nahrazen výrazem ((x) > (y) ? (x) : (y)), což vrátí větší z obou čísel.

Makra s parametry

Makra mohou mít také parametry. Tyto parametry jsou předány makru jako části definice a mohou být nahrazeny v definici makra. Parametry se zapisují do definice makra pomocí zástupných symbolů ##.

Příklad makra s parametry

Následující příklad definuje makro, které vytvoří funkci pro výpočet druhé mocniny z čísla:

#include <stdio.h>
      
      #define SQUARE(x) ((x) * (x))
      
      int main() {
          int cislo = 5;
          printf("Druha mocnina cisla %d je %d\n", cislo, SQUARE(cislo));
          return 0;
      }
      

Po překladu bude příkaz SQUARE(cislo) nahrazen výrazem ((cislo) * (cislo)), což vrátí druhou mocninu z čísla.

Podmíněná makra

Makra mohou být také definována podmíněně pomocí předkompilačních příkazů #ifdef a #endif. To umožňuje přizpůsobit chování programu podle přítomnosti nebo absence určitého makra nebo definování jeho hodnoty.

Příklad podmíněného makra

Následující příklad ukazuje, jak definovat makro pouze pokud je aktivována příznaková konstanta DEBUG:

#include <stdio.h>
      
      #ifdef DEBUG
      #define DEBUG_MSG(msg) printf("DEBUG: %s\n", (msg))
      #else
      #define DEBUG_MSG(msg)
      #endif
      
      int main() {
          DEBUG_MSG("Toto je debugovaci zprava");
          return 0;
      }
      

Pokud je aktivována příznaková konstanta DEBUG, makro DEBUG_MSG bude nahrazeno příkazem printf("DEBUG: %s\n", (msg)), jinak bude ignorováno.

Závěr

Makra jsou užitečným nástrojem v jazyce C pro definici textových zástupců a zkrácených funkcí. Jsou však také silným nástrojem, který vyžaduje opatrnost a správné použití. Pamatujte, že makra jsou zpracovávána před samotným překladem, což může vést k nechtěným vedlejším efektům, pokud nejsou správně použita.