X Makro - X Macro

X Makra jsou technika pro spolehlivou údržbu paralelních seznamů , kódu nebo dat, jejichž odpovídající položky se musí objevit ve stejném pořadí. Jsou nejužitečnější tam, kde alespoň některé ze seznamů nelze sestavit indexováním, například čas kompilace .

Mezi příklady takových seznamů patří zejména inicializace polí, ve shodě s deklaracemi konstant výčtu a prototypy funkcí, generování sekvencí příkazů a přepínacích ramen atd.

Používání X Makra sahá až do 60. let. Zůstává užitečná i v současných programovacích jazycích C a C ++ , ale zůstává relativně neznámá.

Implementace

Aplikace makra X se skládá ze dvou částí:

  1. Definice prvků seznamu.
  2. Rozšíření seznamu pro generování fragmentů prohlášení nebo prohlášení.

Seznam je definován souborem makra nebo záhlaví (pojmenovaný, LIST ), který sám generuje žádný kód, ale pouze se skládá ze sledu vyvolání makra (klasicky pojmenovaného „ X “) s daty prvků. Každému rozšíření o LIST předchází definice X syntaxe prvku seznamu. Vyvolání LIST rozbalení X pro každý prvek v seznamu.

Příklad

Tento příklad definuje seznam proměnných a automaticky generuje jejich deklarace a funkci pro jejich tisk.

Nejprve definice seznamu. Položky seznamu mohou obsahovat více argumentů, ale zde se používá pouze název proměnné.

#define LIST_OF_VARIABLES \
    X(value1) \
    X(value2) \
    X(value3)

Poté provedeme tento seznam a vygenerujeme deklarace proměnných:

#define X(name) int name;
LIST_OF_VARIABLES
#undef X

Podobným způsobem můžeme vygenerovat funkci, která vytiskne proměnné a jejich názvy:

void print_variables(void)
{
#define X(name) printf(#name " = %d\n", name);
LIST_OF_VARIABLES
#undef X
}

Při spuštění prostřednictvím preprocesoru C se vygeneruje následující kód. Za účelem snadného čtení byly přidány konce řádků a odsazení, i když ve skutečnosti nejsou generovány preprocesorem:

int value1;
int value2;
int value3;

void print_variables(void)
{
    printf("value1" " = %d\n", value1);
    printf("value2" " = %d\n", value2);
    printf("value3" " = %d\n", value3);
}

Další čtení

Reference