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:
- Definicja elementów listy.
- 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);
}