X Makro - X Macro

Makra X to technika niezawodnej obsługi równoległych list , kodu lub danych, których odpowiadające pozycje muszą występować w tej samej kolejności. Są najbardziej przydatne, gdy przynajmniej niektórych list nie można utworzyć przez indeksowanie, na przykład w czasie kompilacji .

Przykłady takich list obejmują w szczególności inicjalizację tablic, w połączeniu z deklaracjami stałych wyliczania i prototypów funkcji, generowanie sekwencji instrukcji i ramion przełączających itp.

Wykorzystanie X Macros sięga lat sześćdziesiątych XX wieku. Pozostaje przydatna również we współczesnych językach programowania C i C ++ , ale pozostaje stosunkowo nieznana.

Realizacja

Aplikacja makra X składa się z dwóch części:

  1. Definicja elementów listy.
  2. Rozszerzenie (a) listy w celu wygenerowania fragmentów deklaracji lub instrukcji.

Lista jest definiowana przez makro lub plik nagłówkowy (o nazwie LIST ), który sam nie generuje kodu, a jedynie składa się z sekwencji wywołań makra (klasycznie nazwanego „ X ”) z danymi elementów. Każde rozwinięcie LIST poprzedzone jest definicją X składni elementu listy. Wywołanie LIST rozwija się X dla każdego elementu na liście.

Przykład

Ten przykład definiuje listę zmiennych i automatycznie generuje ich deklaracje oraz funkcję do ich wydrukowania.

Najpierw definicja listy. Wpisy listy mogą zawierać wiele argumentów, ale tutaj używana jest tylko nazwa zmiennej.

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

Następnie wykonujemy tę listę, aby wygenerować deklaracje zmiennych:

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

W podobny sposób możemy wygenerować funkcję, która wypisuje zmienne i ich nazwy:

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

Podczas uruchamiania przez preprocesor C generowany jest następujący kod. Aby ułatwić czytanie, dodano podziały wierszy i wcięcia, mimo że w rzeczywistości nie są one generowane przez preprocesor:

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);
}

Dalsza lektura

Bibliografia