Sdílet prostřednictvím


Makra (C/C++)

Předzpracování rozbalí makra na všech řádcích, které nejsou direktivami preprocesoru (řádky, které nemají # jako první znak pro prázdné místo) a 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 kompilace částí zdrojového souboru testováním konstantního výrazu nebo identifikátoru k určení, které textové bloky jsou předány kompilátoru a které textové bloky jsou odstraněny ze zdrojového souboru 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, které představují konstanty jsou někdy označovány jako "symbolické konstanty" nebo "konstanty manifestu". Identifikátory, které představují příkazy nebo výrazy jsou označovány jako "makra". V této dokumentaci preprocesoru se používá pouze termín "makro".

Po rozpoznání názvu makra ve zdrojovém textu programu nebo v argumentech určitých dalších příkazů preprocesoru, je toto makro považováno za volání 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 "objektového typu" nepřijímají žádné argumenty, kdežto makra "funkčního typu" lze definovat pro přijímání argumentů tak, že se budou chovat a vypadat jako volání funkce.Vzhledem k tomu, že makra negenerují volání skutečné funkce, je někdy možné zvýšit rychlost programů nahrazením volání funkcí makry. (V jazyce C++ jsou často upřednostňovanou metodou vložené funkce). Makra však mohou působit problémy, pokud nejsou definována a používána opatrně.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 naleznete v příkladu getrandom v tématu Direktivy #define.

Po definování makra jej nelze předefinovat na jinou hodnotu, aniž by byla nejdříve odstraněna původní definice.Je však možné předefinovat makro stejnou definicí.Stejná definice se tedy v programu může objevit více než jednou.

Direktiva #undef definici z makra odebere.Po odebrání definice lze makro upravit na jinou hodnotu.Témata Direktiva #define a Direktiva #undef probírají direktivy #define a #undef.

Další informace naleznete v tématu:

Viz také

Další zdroje

C/C++ – referenční dokumentace preprocesoru