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.
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í.
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 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ů ##
.
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.
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.
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.
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.