- 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
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
#include <stdio.h>
#define SPLICE(a,b) SPLICE_1(a,b)
#define SPLICE_1(a,b) SPLICE_2(a,b)
#define SPLICE_2(a,b) a##b
#define PP_ARG_N( \
_1, _2, _3, _4, _5, _6, _7, _8, _9, _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, N, ...) N
/* Note 63 is removed */
#define PP_RSEQ_N() \
62, 61, 60, \
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
9, 8, 7, 6, 5, 4, 3, 2, 1, 0
#define PP_NARG_(...) PP_ARG_N(__VA_ARGS__)
/* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
#define PP_NARG(...) PP_NARG_(_, ##__VA_ARGS__, PP_RSEQ_N())
#define MAX_1(VAR, ...) \
VAR
#define MAX_2(VAR, ...) \
(((VAR)>MAX_1(__VA_ARGS__))?(VAR):MAX_1(__VA_ARGS__))
#define MAX_3(VAR, ...) \
(((VAR)>MAX_2(__VA_ARGS__))?(VAR):MAX_2(__VA_ARGS__))
#define MAX_4(VAR, ...) \
(((VAR)>MAX_3(__VA_ARGS__))?(VAR):MAX_3(__VA_ARGS__))
#define MAX_5(VAR, ...) \
(((VAR)>MAX_4(__VA_ARGS__))?(VAR):MAX_4(__VA_ARGS__))
#define MAX_6(VAR, ...) \
(((VAR)>MAX_5(__VA_ARGS__))?(VAR):MAX_5(__VA_ARGS__))
#define MAX_7(VAR, ...) \
(((VAR)>MAX_6(__VA_ARGS__))?(VAR):MAX_6(__VA_ARGS__))
#define MAX_8(VAR, ...) \
(((VAR)>MAX_7(__VA_ARGS__))?(VAR):MAX_7(__VA_ARGS__))
#define MAX_9(VAR, ...) \
(((VAR)>MAX_8(__VA_ARGS__))?(VAR):MAX_8(__VA_ARGS__))
#define MAX_10(VAR, ...) \
(((VAR)>MAX_9(__VA_ARGS__))?(VAR):MAX_9(__VA_ARGS__))
#define MAX_11(VAR, ...) \
(((VAR)>MAX_10(__VA_ARGS__))?(VAR):MAX_10(__VA_ARGS__))
//..... дальше лень ...
#define MAXS_(N, ...) \
SPLICE(MAX_, N)(__VA_ARGS__)
#define MAXS(...) \
MAXS_(PP_NARG(__VA_ARGS__), __VA_ARGS__)
int main(void)
{
printf("%d", MAXS(24, 324, 377, 347, 100500, 2442, 224, 7428));
}
Макрос MAXS() который принимает произвольное число аргументов и через тернарники заворачивает их, было сделано на основе http://govnokod.ru/14511 говна.
(((6)>(((5)>(((4)>(((3)>2)?(3):2))?(4):( ((3)>2)?(3):2)))?(5):(((4)>(((3)>2)?(3): 2))?(4):(((3)>2)?(3):2))))?(6):(((5)>((( 4)>(((3)>2)?(3):2))?(4):(((3)>2)?(3):2)) )?(5):(((4)>(((3)>2)?(3):2))?(4):(((3)>2 )?(3):2))))
на с++17 слишком просто
EDIT: Не поверите, constexpr забыл.
Ну если потребовать один тип у всех аргументов max, то вроде даже на C++11 несложно:
- Otherwise, if either operand is double, the other shall be converted to double.
- Otherwise, if either operand is float, the other shall be converted to float.
- Otherwise, the integral promotions shall be performed on both operands.
- Then, if either operand is unsigned long the other shall be converted to unsigned long.
- Otherwise, if one operand is a long int and the other unsigned int, then if a long int can represent all the values of an unsigned int, the unsigned int shall be converted to a long int; otherwise both operands shall be converted to unsigned long int.
- Otherwise, if either operand is long, the other shall be converted to long.
- Otherwise, if either operand is unsigned, the other shall be converted to unsigned.
[Note: otherwise, the only remaining case is that both operands are int]
Если посмотреть в сигнатуру std::max, видно, что он практически не отличается от того, что мы тут написали, и более магическими свойствами обладать не может. Далее, constexpr он стал только в c++14.
И вообще я его не люблю, он ссылку на аргумент возвращает. Прекрасный способ выстрелить себе в ногу.
В стандарте это где-то написано? Что такое built-in функции?
> В стандарте
Настоящие цари затачивают код под фишки конкретного конпелятора.
Дороговато выйдет... Или просто под FPGA синтезируют?
Вообще, настоящие цари не хотят ограничиваться 3D пространством при создании процессора. Настоящие цари создадут особое устройство, способное открывать портал в параллельные измерения, с большей пространственной размерностью, более высокой скоростью света и более подходящими физическими законами для создания идеального неанскильного процессора.
Кстати, мне понравились некоторые ссылки из статьи:
https://geektimes.ru/post/256758/
https://geektimes.ru/post/256792/
Для настоящих царей.
«Писать мне лучше на email: [email protected]»
«Сайт: http://3.14.by»
Кто знает, над чем я ржу?
http://3.14.by/ru/read/KR580VM80A-intel-i8080-verilog-reverse-engineering
Туда ещё вложена пэдээфка со схемой (4758 транзисторов).
Прикольно, там даже не КМОП, все транзисторы одинаковые, n-канальные...
http://zeptobars.com/ru/read/FTDI-FT232RL-real-vs-fake-supereal
Китайцы в данном случае не просто сделали "фейк", а взяли готовый программируемый маской при производстве микроконтроллер (так нужно менять только одну маску - это намного дешевле и объясняет лишние контакты на кристалле) и заказали изготовление партии этих микросхем на заводе.
1) препроцессирование
2) пэхапэ
• homoiconicity
• https://github.com/raganwald-deprecated/homoiconic
• Vanish
• shed
P.S. В 2017-2018 тролли с подтиралками поп комментариев подустанут, придут ньюфаги читать старые посты, а там inkanus-gray-телепат разговаривает с заванишеной бездной.
Или конкретно http://deswork.com/images/our-work/18/vanish_6_1100.jpg
ты от этого тупеешь