Sdílet prostřednictvím


Makra (C/C++)

Preprocesor rozbalí makra ve všech řádcích kromě direktiv preprocesoru, řádků, které mají # první znak bez prázdného znaku. Rozšiřuje makra v částech některých direktiv, které nejsou vynechány jako součást podmíněné kompilace. Direktivy podmíněné kompilace umožňují potlačit kompilaci částí zdrojového souboru. Testují konstantní výraz nebo identifikátor, aby určily, které textové bloky se mají předat kompilátoru a které z zdrojového souboru se mají odebrat během předběžného zpracování.

Direktiva #define je obvykle použita pro přiřazení smysluplných identifikátorů konstantám, klíčovým slovům a běžně používaným příkazům a výrazům. Identifikátory představující konstanty se někdy označují jako symbolické konstanty nebo konstanty manifestu. Identifikátory, které představují příkazy nebo výrazy, se nazývají makra. V této dokumentaci preprocesoru se používá pouze termín „makro“.

Pokud je název makra rozpoznán ve zdrojovém textu programu nebo v argumentech některých dalších příkazů preprocesoru, považuje se za volání tohoto makra. Název makra je nahrazen kopií těla makra. Pokud makro přijímá argumenty, jsou v těle makra argumenty za názvem makra nahrazeny skutečnými parametry. Proces nahrazení volání makra zpracovanou kopií těla se nazývá rozšíření volání makra.

V praxi existují dva typy maker. Makra podobná objektům nepřebírají žádné argumenty. Makra podobná funkcím lze definovat tak, aby přijímala argumenty, aby vypadala a fungovala jako volání funkcí. Vzhledem k tomu, že makra negenerují skutečná volání funkcí, můžete někdy zrychlit spouštění programů nahrazením volání funkcí makry. (V jazyce C++ jsou vložené funkce často upřednostňovanou metodou.) Makra ale můžou vytvářet problémy, pokud je nedefinujete a nepoužíváte s opatrností. U definice maker bude možná zapotřebí používat závorky spolu s argumenty, aby bylo možné zachovat správnou prioritu ve výrazu. Makra také nemusí správně zpracovávat výrazy s vedlejšími účinky. Další informace najdete v příkladu getrandom v direktivě #define.

Jakmile definujete makro, nemůžete ho předefinovat na jinou hodnotu, aniž byste nejprve odebrali původní definici. Je však možné předefinovat makro stejnou definicí. Proto se stejná definice může v programu objevit více než jednou.

Direktiva #undef odebere definici makra. Jakmile definici odeberete, můžete makro předefinovat na jinou hodnotu. Směrnice #define a směrnice #undef probírají směrnice #define a #undef směrnice.

Další informace najdete v tématu .

Viz také

Referenční dokumentace preprocesoru C/C++