- 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__?
bormand 11.03.2015 21:15 # +1
> Объясните
Если кратко - то # и ## блокируют рекурсивное раскрытие своих аргументов.
gigaproger 12.03.2015 16:53 # 0
bormand 12.03.2015 17:03 # 0
https://en.wikipedia.org/wiki/Lisp_%28programming_language%29
https://en.wikipedia.org/wiki/Scheme_%28programming_language%29
P.S. Да даже m4 лучше, чем сишный препроцессор.
P.P.S. Только, пожалуйста, не говори мне, что я "ниасилил" сишный препроцессор.
gigaproger 12.03.2015 23:36 # 0
bormand 13.03.2015 01:11 # 0
bormand 13.03.2015 01:26 # 0
Само собой, асму хороший препроцессор важнее, чем сишке. Но сишный, имхо, сделан вообще на отъебись.
bormand 11.03.2015 21:29 # +3
В правильном коде препроцессор видит 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__.
heyzea1 12.03.2015 17:58 # +1
мимо-скрипт-макака
Dummy00001 13.03.2015 01:40 # 0
bormand 13.03.2015 02:00 # 0
LispGovno 11.03.2015 22:15 # 0
Боян много раз