ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
24 марта
1506558 Топик полностью
Eddy_Em (17.03.2025 16:08, просмотров: 185) ответил Eddy_Em на Вот, я его попросил, и он мне такую портянку накатал:
И на вопрос: "And what to do if data types of a and b are different?" родил такой шедевр: 
#include <stdint.h>

// Determine the common type for two values
#define COMMON_TYPE(x, y) _Generic((x), \
    int16_t: _Generic((y), \
        int16_t: int16_t, \
        int32_t: int32_t, \
        int64_t: int64_t, \
        float: float, \
        double: double \
    ), \
    int32_t: _Generic((y), \
        int16_t: int32_t, \
        int32_t: int32_t, \
        int64_t: int64_t, \
        float: float, \
        double: double \
    ), \
    int64_t: _Generic((y), \
        int16_t: int64_t, \
        int32_t: int64_t, \
        int64_t: int64_t, \
        float: float, \
        double: double \
    ), \
    float: _Generic((y), \
        int16_t: float, \
        int32_t: float, \
        int64_t: float, \
        float: float, \
        double: double \
    ), \
    double: _Generic((y), \
        int16_t: double, \
        int32_t: double, \
        int64_t: double, \
        float: double, \
        double: double \
    ) \
)

// MAX macro with type promotion #define MAX(x, y) ({ \ COMMON_TYPE(x, y) _x = (x); \ COMMON_TYPE(x, y) _y = (y); \ _Generic(_x, \ int16_t: max_i16, \ int32_t: max_i32, \ int64_t: max_i64, \ float: max_float, \ double: max_double \ )(_x, _y); \ }) // MIN macro (similar to MAX) #define MIN(x, y) ({ \ COMMON_TYPE(x, y) _x = (x); \ COMMON_TYPE(x, y) _y = (y); \ _Generic(_x, \ int16_t: min_i16, \ int32_t: min_i32, \ int64_t: min_i64, \ float: min_float, \ double: min_double \ )(_x, _y); \ })


Блин, это даже в реальном коде использовать можно! Круто!!!

eddy-em.livejournal.com github.com/eddyem