- 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
> виден-ли тут i?
Нет.
> а если нет, то почему Foo виден?
Foo это тип? почему его должно быть не видно?
> Foo копируется?
Да. Надо писать
catch (const Foo& foo)
А вообще объекты, брошенные через throw, живут не на стеке. Поэтому размотка стека на них не влияет.
Не обязательно копируется. Это ты сам попросил копию в catch. Скорее всего, throw сам вызывает конструктор на заранее подготовленном участке памяти.
> А где сам foo живет?
Стандарт не скажет тебе явно, где. Но очевидно, что не на стеке, поэтому всё и работает.
разумеется, нет
Такое тоже можно написать, но тогда удалять надо после поимки. Так делать не надо.
delete p;
}
Подозреваю, что так не поймается, проверь. Удалять по ссылке тоже нельзя.
Ты же кинул указатель, ловить нужно тоже указатель.
catch (const Petux * const p) {
// петухам тут не место.
delete p;
}
Осмелюсь предположить, что (тип) Foo был обьявлен где-то выше. Потому и доступен.
> } catch(Foo f) {
А вот тут ты копируешь себе `Foo f`.
Не знаю, как именно, но выбрасываемое значение записывается в специальное место, чтоб `catch` (и std::current_exception) мог это значение достать.
https://en.cppreference.com/w/cpp/error/current_exception
Бля, есть хоть што-то, что ещё не придумано?
Ну смотря как метушить. Небольшие шаблоны удаётся заинлайнить и от них остаётся пара-тройка инструкций... Чего не скажешь об операторе сдвига в поток.
Да.
> то сразу же вся инлайноптитмизация пойдет лесом
Нет. Иногда и так справляется.