- 1
- 2
- 3
- 4
- 5
#define CONC_LINE(a) CONC(a, __LINE__)
#define CONC(a, b) __CONC(a, b)
#define __CONC(a, b) a##b
// ...
int CONC_LINE(name);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+135
#define CONC_LINE(a) CONC(a, __LINE__)
#define CONC(a, b) __CONC(a, b)
#define __CONC(a, b) a##b
// ...
int CONC_LINE(name);
Способ присовокупить к названию переменной номер строки, где её объявили.
Объясните кто-нибудь, почему #define CONC_LINE (a) __CONC ( a, __LINE__ ) дает: name__LINE__?
> Объясните
Если кратко - то # и ## блокируют рекурсивное раскрытие своих аргументов.
https://en.wikipedia.org/wiki/Lisp_%28programming_language%29
https://en.wikipedia.org/wiki/Scheme_%28programming_language%29
P.S. Да даже m4 лучше, чем сишный препроцессор.
P.P.S. Только, пожалуйста, не говори мне, что я "ниасилил" сишный препроцессор.
Само собой, асму хороший препроцессор важнее, чем сишке. Но сишный, имхо, сделан вообще на отъебись.
В правильном коде препроцессор видит CONC_LINE(name) и заменяет его на CONC(name, __LINE__) при этом раскрыв все макросы в name (которых там нет). На результате запускается повторный скан: препроцессор видит CONC(name, __LINE) и заменяет его на __CONC(name, 42), раскрыв все макросы в name (которых там нет) и __LINE__ (который раскроется в номер строки). На результате запускается еще один скан: препроцессор видит __CONC(name, 42) и заменяет его на name42 НЕ раскрывая макросы в name и 42.
А если сделать сразу __CONC, то получится так: препроцессор видит CONC_LINE(name) и заменяет его на __CONC(name, __LINE__) предварительно раскрыв все макро в name (которых там нет). На втором проходе он видит __CONC(name, __LINE__) и заменяет его на name__LINE__ НЕ раскрывая макросы в name и __LINE__.
мимо-скрипт-макака
Боян много раз