Wyjaśnienie fragmentu kodu. (#define)

0

Cześć,
pracuję nad gotowym kodem w C, jestem w trakcie zapoznawania się z nim i trafiłem na coś takiego:

#define X0(a, b)                     a ## b
#define X(a, b)                      X0(a, b)

#define TMP                X(prefix, _Instance)

i w innym pliku jest:

TMP global;

Nie za bardzo mogę dość co tu się dzieje, wredne define!

0

Moim zdaniem, tak należy to interpretować poczynając od TMP global;:

TMP global;

X(prefix, _Instance) global;

X0(prefix, _Instance) global;

prefix ## _Instance global;

Co to jest prefix ## _Instance global; i jakie ma znaczenie to już nie wiem.

0

Wiem co to robi, ale też nie pojmuję idei…

## to w preprocesorze w C „lepik” — polecenie sklejające dwie wartości ze sobą. Tak więc jakbyś miał np. X0("abc", "def"), to powstałoby z tego "abc" "def" (tam powinny być dwie spacje, ale mi z jakiegoś powodu forum wycina…). Nie bardzo ogarniam, po co komu coś takiego ze spacjami… Bez spacji mielibyśmy konkatenację, w sumie nic niezwykłego (ale po co do tego makro?), z nimi… nie ogarniam wcale.

Bardziej użyteczny, chociaż też naciągany, przykład, to #define BACKUP(type, variable) type variable##_backup = variable, które nam pozwala zrobić nową zmienną z przyrostkiem _backup i przypisać jej poprzednią wartość.

1

Czyli prefix ## _Instance global; powinno być zinterpretowane jako prefix_Instance global;?

0

Tak, tylko ze spacjami → prefix _Instance global;

0

No dobra, będę "bawił" się dalej

3

Może Ci pomoże nakazanie kompilatorowi wyrzucenie kodu po przebiegu preprocesora. Np. dla GCC byłoby to gcc -dM -E

0

@Althorion: Korzystałem z tego i nie pomogło za bardzo, ale teraz sobie zdałem sprawę że tam jednej rzeczy nie dodałem i to dlatego mi nie pomogło. Po małej modyfikacji fajnie pomogło, i mogę sam sobie odpowiedzieć na pytanie z wątku: Została stworzona zmienna (global) o typie prefix_Instance -> prefix_Instance global;. Co dla mnie jest idiotyczne ale no może się jeszcze mi później wyjaśni dlaczego to ktoś tak nieludzko zrobił.

1 użytkowników online, w tym zalogowanych: 0, gości: 1