Wyjaśnienie fragmentu kodu. (#define)

Wyjaśnienie fragmentu kodu. (#define)
PR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 316
0

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

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

#define TMP                X(prefix, _Instance)

i w innym pliku jest:

Kopiuj
TMP global;

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

AN
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
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.

Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
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ść.

AN
  • Rejestracja: dni
  • Ostatnio: dni
1

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

Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
0

Tak, tylko ze spacjami → prefix _Instance global;

PR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 316
0

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

Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
3

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

PR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 316
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ł.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.