- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
#include <stdio.h>
//#include <ynopoTocTb.h>
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define CAT(...) PRIMITIVE_CAT(__VA_ARGS__)
#define EAT(...)
#define EXPAND(...) __VA_ARGS__
#define IIF(c) PRIMITIVE_CAT(IIF_, c)
#define IIF_1(...) __VA_ARGS__ EAT
#define IIF_0(...) EXPAND
#define COMPL(x) PRIMITIVE_CAT(COMPL_, x)
#define COMPL_1 0
#define COMPL_0 1
#define CHECK_N(x, n, ...) n
#define CHECK(...) CHECK_N(__VA_ARGS__, 0)
#define PROBE(x) x, 1
#define NOT(x) CHECK(PRIMITIVE_CAT(NOT_, x))
#define NOT_0 PROBE(~)
#define BOOL(x) COMPL(NOT(x))
#define IF(c) IIF(BOOL(c))
#define EMPTY()
#define DEFER(id) id EMPTY()
#define OBSTRUCT(id) id DEFER(EMPTY)()
#define EVAL(...) EVAL1(EVAL1(EVAL1(EVAL1(__VA_ARGS__))))
#define EVAL1(...) EVAL2(EVAL2(EVAL2(EVAL2(__VA_ARGS__))))
#define EVAL2(...) EVAL3(EVAL3(EVAL3(EVAL3(__VA_ARGS__))))
#define EVAL3(...) EVAL4(EVAL4(EVAL4(EVAL4(__VA_ARGS__))))
#define EVAL4(...) EVAL5(EVAL5(EVAL5(EVAL5(__VA_ARGS__))))
#define EVAL5(...) __VA_ARGS__
#define DEC(x) PRIMITIVE_CAT(DEC_, x)
#define DEC_0 0
#define DEC_1 0
#define DEC_2 1
#define DEC_3 2
#define DEC_4 3
#define DEC_5 4
#define DEC_6 5
#define DEC_7 6
#define DEC_8 7
#define DEC_9 8
#define FACTORIAL(x) \
IF(NOT(x)) (1) \
( \
OBSTRUCT(FACTORIAL_INDIRECT)()(DEC(x)) * x \
)
#define FACTORIAL_INDIRECT() FACTORIAL
#define PRIMITIVE_TO_STR(...) # __VA_ARGS__
#define TO_STR(...) PRIMITIVE_TO_STR(__VA_ARGS__)
int main() {
printf("7! = " TO_STR(EVAL(FACTORIAL(7))) " = %d", EVAL(FACTORIAL(7)));
return 0;
}
Продолжаю макроёбить.
https://ideone.com/WcG7i2
Использованы материалы из стотьи
https://github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms
adrnin 01.11.2018 15:02 # 0
adrnin 01.11.2018 15:11 # 0
guest8 01.11.2018 20:05 # −999
adrnin 01.11.2018 22:23 # 0
guest8 01.11.2018 16:29 # −999
roman-kashitsyn 01.11.2018 16:36 # +1
> виден-ли тут i?
Нет.
> а если нет, то почему Foo виден?
Foo это тип? почему его должно быть не видно?
> Foo копируется?
Да. Надо писать
catch (const Foo& foo)
А вообще объекты, брошенные через throw, живут не на стеке. Поэтому размотка стека на них не влияет.
guest8 01.11.2018 16:40 # −999
roman-kashitsyn 01.11.2018 16:41 # +1
Не обязательно копируется. Это ты сам попросил копию в catch. Скорее всего, throw сам вызывает конструктор на заранее подготовленном участке памяти.
> А где сам foo живет?
Стандарт не скажет тебе явно, где. Но очевидно, что не на стеке, поэтому всё и работает.
guest8 01.11.2018 16:43 # −999
roman-kashitsyn 01.11.2018 16:43 # 0
разумеется, нет
guest8 01.11.2018 16:42 # −999
roman-kashitsyn 01.11.2018 16:47 # 0
Такое тоже можно написать, но тогда удалять надо после поимки. Так делать не надо.
guest8 01.11.2018 16:52 # −999
roman-kashitsyn 01.11.2018 16:58 # +1
delete p;
}
Подозреваю, что так не поймается, проверь. Удалять по ссылке тоже нельзя.
Ты же кинул указатель, ловить нужно тоже указатель.
catch (const Petux * const p) {
// петухам тут не место.
delete p;
}
guest8 01.11.2018 17:04 # −999
adrnin 01.11.2018 17:17 # 0
guest8 01.11.2018 19:23 # −999
guest8 02.11.2018 04:22 # −999
Elvenfighter 01.11.2018 16:36 # 0
Осмелюсь предположить, что (тип) Foo был обьявлен где-то выше. Потому и доступен.
> } catch(Foo f) {
А вот тут ты копируешь себе `Foo f`.
Не знаю, как именно, но выбрасываемое значение записывается в специальное место, чтоб `catch` (и std::current_exception) мог это значение достать.
https://en.cppreference.com/w/cpp/error/current_exception
guest8 01.11.2018 16:41 # −999
adrnin 01.11.2018 17:13 # 0
roman-kashitsyn 01.11.2018 17:18 # 0
adrnin 01.11.2018 17:39 # 0
Бля, есть хоть што-то, что ещё не придумано?
adrnin 01.11.2018 17:20 # +1
guest8 01.11.2018 17:43 # −999
adrnin 01.11.2018 17:45 # 0
guest8 01.11.2018 17:46 # −999
guest8 01.11.2018 17:54 # −999
guest8 01.11.2018 17:51 # −999
bormand 01.11.2018 19:19 # +1
Ну смотря как метушить. Небольшие шаблоны удаётся заинлайнить и от них остаётся пара-тройка инструкций... Чего не скажешь об операторе сдвига в поток.
guest8 01.11.2018 19:38 # −999
guest8 01.11.2018 19:26 # −999
bormand 01.11.2018 19:29 # 0
Да.
> то сразу же вся инлайноптитмизация пойдет лесом
Нет. Иногда и так справляется.
guest8 01.11.2018 19:32 # −999
guest8 01.11.2018 20:01 # −999
bormand 01.11.2018 20:06 # 0
guest8 01.11.2018 20:08 # −999
guest8 01.11.2018 20:55 # −999
guest8 01.11.2018 21:03 # −999
guest8 01.11.2018 21:15 # −999
guest8 01.11.2018 21:05 # −999
guest8 01.11.2018 21:16 # −999
guest8 01.11.2018 21:17 # −999
KitKat 01.11.2018 21:30 # 0
guest8 01.11.2018 21:32 # −999
viagrinho 09.12.2018 17:51 # −102
j123123 09.12.2018 00:25 # 0
guest8 09.12.2018 01:25 # −999
govnokod3r 01.11.2018 21:59 # +1
adrnin 02.11.2018 05:40 # 0
KitKat 02.11.2018 06:11 # 0
adrnin 02.11.2018 07:01 # 0
bormand 02.11.2018 07:10 # 0