- 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
/* --- PRINTF_BYTE_TO_BINARY macro's --- */
#define PRINTF_BINARY_PATTERN_INT8 "%c%c%c%c%c%c%c%c"
#define PRINTF_BYTE_TO_BINARY_INT8(i) \
(((i) & 0x80ll) ? '1' : '0'), \
(((i) & 0x40ll) ? '1' : '0'), \
(((i) & 0x20ll) ? '1' : '0'), \
(((i) & 0x10ll) ? '1' : '0'), \
(((i) & 0x08ll) ? '1' : '0'), \
(((i) & 0x04ll) ? '1' : '0'), \
(((i) & 0x02ll) ? '1' : '0'), \
(((i) & 0x01ll) ? '1' : '0')
#define PRINTF_BINARY_PATTERN_INT16 \
PRINTF_BINARY_PATTERN_INT8 PRINTF_BINARY_PATTERN_INT8
#define PRINTF_BYTE_TO_BINARY_INT16(i) \
PRINTF_BYTE_TO_BINARY_INT8((i) >> 8), PRINTF_BYTE_TO_BINARY_INT8(i)
#define PRINTF_BINARY_PATTERN_INT32 \
PRINTF_BINARY_PATTERN_INT16 PRINTF_BINARY_PATTERN_INT16
#define PRINTF_BYTE_TO_BINARY_INT32(i) \
PRINTF_BYTE_TO_BINARY_INT16((i) >> 16), PRINTF_BYTE_TO_BINARY_INT16(i)
#define PRINTF_BINARY_PATTERN_INT64 \
PRINTF_BINARY_PATTERN_INT32 PRINTF_BINARY_PATTERN_INT32
#define PRINTF_BYTE_TO_BINARY_INT64(i) \
PRINTF_BYTE_TO_BINARY_INT32((i) >> 32), PRINTF_BYTE_TO_BINARY_INT32(i)
/* --- end macros --- */
#include <stdio.h>
int main() {
long long int flag = 1648646756487983144ll;
printf("My Flag "
PRINTF_BINARY_PATTERN_INT64 "\n",
PRINTF_BYTE_TO_BINARY_INT64(flag));
return 0;
}
А еще я как-то попытался взять указатель на функцию, а она оказалась макросом
Я тогда здорово перепугалось
В гнусях, вроде, трамплин будет только если возвращать указатель на вложенную функцию (вот это уже замыкание). А так, для простых вложенных функций это нахуй не надо, просто органичит область видимости.
Может быть, этот ключ работает только на определённых платформах?
Вообще-то и в сях инлайн есть, и генерики, но общим будет только имя, реализацию для разных типов придется писать свою.
Я про _Generic.
https://en.cppreference.com/w/c/language/generic
1. typeof на этапе компиляции извлекает из выражения его тип. Что-то типа auto в новых крестах.
2. Фигурные скобки ограничивают блок. Блок может возвращать значение (почти как в скриптовых языках): берётся значение последней операции.
3. Ну и круглые скобки на всякий случай, чтобы показать, что нужно извлечь значение выражения.
За пределами gcc это всё работать не обязано.
В каких ещё языках, кроме "R", возвращаемое значение - значение последней операции?
https://scifanatic-wpengine.netdna-ssl.com/wp-content/uploads/2017/03/facepalm-head.jpg
Отлично груви зашёл, рекомендую.
АХАХАХАХАХАХ
https://gcc.godbolt.org/z/Coc9oy
https://ideone.com/tfrPdX
Вероятно, нечётное значение указателя в примере с пустыми квадратными скобками означало, что ничего не захвачено.
Кстати, уже с -O1 в обоих примерах всё инлайнится и заменяется на вычисленную в компайлтайме константу.
Да, при включенной оптимизации, если аргументы являются константами, компилятор лямбду выкинет и заменит на результат. А если аргументы переменные, всегда ли он сможет оптимизировать? Компилятор создаст две совершенно одинаковые реализации лямбды. А если вызов MIN использовать много раз, то будет какой багор.