Sdílet prostřednictvím


#define – direktiva (C++)

#define vytvoří makro, což je seskupení identifikátoru nebo identifikátoru s parametry a řetězce tokenu.Po definování makra může kompilátor nahradit řetězec tokenu pro každý výskyt identifikátoru ve zdrojovém souboru.

Syntax

#defineidentifiertoken-stringopt

#defineidentifier(identifieropt,...,identifieropt)token-stringopt

Poznámky

Direktiva #define způsobí, že kompilátor nahradí token-string u každého výskytu identifier ve zdrojovém souboru.identifier se nahrazuje pouze v případě, že tvoří token.To znamená, že identifier nebude nahrazen, je-li uveden v komentáři, v řetězci, nebo jako součást delšího identifikátoru.Další informace naleznete v tématu Tokeny jazyka C++.

Argument token-string sestává z řady tokenů, jako jsou klíčová slova, konstanty nebo úplná prohlášení.Parametry token-string a identifier je třeba oddělit pomocí jednoho nebo více prázdných znaků.Toto prázdné místo není považováno za součást nahrazeného textu, ani není libovolným prázdný znakem, který následuje za posledním tokenem textu.

#define bez token-string odstraní výskyty identifier ze zdrojového souboru.identifier zůstane definován a může být testován pomocí direktiv #if defined a #ifdef.

Druhá forma syntaxe definuje funkci podobnou makru s parametry.Tento tvar přijímá volitelný seznam parametrů, které musí být uvedeny v závorkách.Poté, co je makro definované, každý další výskyt identifier(identifieropt,..., identifieropt) je nahrazen verzí argumentu token-string, který má skutečné argumenty nahrazené za formální parametry.

Formální názvy parametru se zobrazí v token-string k označení míst, kde jsou nahrazeny skutečné hodnoty.Každý název parametru se může objevit víckrát v token-string a názvy se mohou objevit v libovolném pořadí.Počet argumentů ve volání musí odpovídat počtu parametrů v definici makra.Liberální použití závorek zaručuje správnou interpretaci složitých skutečných argumentů.

Formální parametry v seznamu jsou odděleny čárkami.Každý název v seznamu musí být jedinečný a seznam musí být uzavřen v závorkách.Mezi příkazem identifier a levou závorkou nesmí být žádné mezery.Pomocí řetězení řádků – umístěte zpětné lomítko (\) bezprostředně před znak – pro dlouhé direktivy na několika zdrojových řádcích.Rozsah formálních parametrů názvu přechází na nový řádek, který končí token-string.

Pokud makro bylo definováno ve druhé formě syntaxe, následné textové instance následované seznamem argumentů značí volání makra.Skutečné argumenty, které následují po instanci identifier ve zdrojovém souboru, budou odpovídat odpovídajícím formálním parametrům v definici makra.Každý formální parametr v token-string, který nezačíná operátorem stringizing (#), charizing (#@), nebo vkládáním tokenu (##), nebo není následován operátorem ##, je nahrazen příslušným skutečným argumentem.Jakékoli makro ve skutečném argumentu je rozbaleno dříve, než direktiva nahradí formální parametr. (Operátory jsou popsány v části Operátory preprocesoru.)

Následující příklady maker s argumenty ilustrují druhou formu syntaxe #define:

// Macro to define cursor lines 
#define CURSOR(top, bottom) (((top) << 8) | (bottom))

// Macro to get a random integer with a specified range 
#define getrandom(min, max) \
    ((rand()%(int)(((max) + 1)-(min)))+ (min))

Argumenty s vedlejšími účinky občas způsobují neočekávané výsledky maker.Daný formální parametr se může zobrazit více než jednou v token-string.Pokud výraz s vedlejšími účinky nahrazuje tento formální parametr, výraz, se svými vedlejšími účinky, může být vyhodnocen více než jednou. (Viz příklady v části Operátor vkládání tokenu (##).)

Direktiva #undef způsobí, že definice preprocesoru identifikátoru budou vymazány.Více informací naleznete v části Direktiva #undef.

Pokud se definovaný název makra vyskytne v token-string (i v důsledku jiného rozšiřujícího makra), nerozbalí se.

Druhý příkaz #define pro makro se stejným názvem vygeneruje upozornění, pokud není druhá sekvence tokenů shodná s první.

Specifické pro Microsoft

Microsoft C/C++ umožňuje znovu definovat makro, pokud je nová definice syntakticky shodná s původní definicí.Jinými slovy dvě definice mohou mít různé názvy parametrů.Toto chování se liší od ANSI C, kde se vyžaduje, aby dvě definice byly lexikálně identické.

Například následující dvě makra jsou shodná s výjimkou názvů parametrů.ANSI C nepovoluje tuto nová definice, ale Microsoft C/C++ jej zkompiluje bez chyb.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )

Na druhé straně následující dvě makra nejsou stejné a budou důvodem vzniku upozornění v jazyce Microsoft C/C++.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )

Specificka produktu Microsoft END

Tento příklad ilustruje směrnici #define:

#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )

První příkaz určuje identifikátor WIDTH jako celočíselnou konstantu 80 a definuje LENGTH z hlediska WIDTH a celočíselnou konstantou 10.Každý výskyt LENGTH je nahrazen (WIDTH + 10).Následně bude každý výskyt WIDTH + 10 nahrazen výrazem (80 + 10).Závorky kolem WIDTH + 10 jsou důležité, protože řídí výklad ve vyjádřeních, jako jsou následující:

var = LENGTH * 20;

Po fázi předzpracování se z příkazu stane:

var = ( 80 + 10 ) * 20;

který se hodnotí jako 1800.Bez závorek je výsledek:

var = 80 + 10 * 20;

který se hodnotí jako 280.

Specifické pro Microsoft

Definování maker a konstant pomocí možnosti /D kompilátoru má stejný účinek jako použití direktivy #define předzpracování na začátku souboru.Pomocí možnosti /D lze definovat až 30 maker.

Specificka produktu Microsoft END

Viz také

Referenční dokumentace

Preprocesor – direktivy