1. Си / Говнокод #29279

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    #include <stdio.h>
    
    typedef struct true_t {
        char _;
    } true_t;
    
    true_t TRUE;
    
    typedef struct false_t {
        char _;
    } false_t;
    
    false_t FALSE;
    
    int f_true() {
        return 1;
    }
    
    int f_false() {
        return 0;
    }
    
    #define bool_v(B) _Generic((B *) (0), true_t *: TRUE, false_t *: FALSE)
    #define bool_v_to_int(B) _Generic(B, true_t: 1, false_t: 0)
    
    #define v_to_bool(V) typeof(V)
    
    #define is_string_v(X) _Generic((X), \
            char *: 1,                   \
            default: 0)
    
    #define is_string_t(X) typeof(_Generic((X), \
            char *: TRUE,                       \
            default: FALSE))
    
    
    #define has_signature_v(X, R, ...)         \
        _Generic((X),                          \
                SignatureM(R, __VA_ARGS__): 1, \
                default: 0)
    
    #define has_signature_t(X, R, ...)            \
        typeof(_Generic((X),                      \
                SignatureM(R, __VA_ARGS__): TRUE, \
                default: FALSE))
    
    #define to_string(x) _Generic((x), \
            true_t: "true",            \
            false_t: "false",          \
            char*: x,                  \
            const char*: x)
    
    #define has_same_type_v(X, Y)       \
        _Generic(has_same_type_t(X, Y), \
                true_t: 1,              \
                false_t: 0)
    
    #define has_same_type_t(X, Y) typeof(_Generic((X), \
            typeof(Y): TRUE,                           \
            default: FALSE))
    
    #define SignatureM(R, ...) R (*)(__VA_ARGS__)
    
    #define is_same_t(X, Y)          \
        typeof(_Generic(((X *) (0)), \
                Y *: TRUE,           \
                default: FALSE))
    
    #define and_t(X, Y)                                                    \
        typeof(_Generic(bool_v(X),                                         \
                true_t: _Generic(bool_v(Y), true_t: TRUE, false_t: FALSE), \
                false_t: _Generic(bool_v(Y), true_t: FALSE, false_t: FALSE)))
    
    #define or_t(X, Y)                                                    \
        typeof(_Generic(bool_v(X),                                        \
                true_t: _Generic(bool_v(Y), true_t: TRUE, false_t: TRUE), \
                false_t: _Generic(bool_v(Y), true_t: TRUE, false_t: FALSE)))
    
    #define not_t(X)               \
        typeof(_Generic(bool_v(X), \
                true_t: FALSE,     \
                false_t: TRUE))
    
    #define result_t(X, ...) typeof((X) (__VA_ARGS__))
    
    #define id_sig(T) SignatureM(T, void)
    #define true_sig id_sig(true_t)
    #define false_sig id_sig(false_t)
    #define _0 false_sig
    #define _1 true_sig
    
    #define bool_sig_v(S) _Generic((S) (0), true_sig: TRUE, false_sig: FALSE)
    #define bool_sig_int(S) _Generic((S) (0), true_sig: 1, false_sig: 0)
    #define bool_sig_t(S) typeof(bool_sig_v(S))
    
    #define sig_apply_res_t(X) typeof(((X) (0))())
    
    #define is_same_sig_t(SA, SB) typeof(_Generic((SA) (0), SB: TRUE, default: FALSE))

    Запостил: j123123, 06 Сентября 2026

    Комментарии (4) RSS

    • #define eq_sig(SA, SB) id_sig(is_same_sig_t(SA, SB))
      
      #define not_sig(SA) id_sig(typeof(_Generic((SA) (0), true_sig: FALSE, false_sig: TRUE)))
      #define and_sig(SA, SB) id_sig(typeof(_Generic((SA) (0), true_sig: _Generic((SB) (0), true_sig: TRUE, false_sig: FALSE), false_sig: FALSE)))
      #define or_sig(SA, SB) id_sig(typeof(_Generic((SA) (0), true_sig: TRUE, false_sig: _Generic((SB) (0), true_sig: TRUE, false_sig: FALSE))))
      #define xor_sig(SA, SB) not_sig(eq_sig(SA, SB))
      
      #define select_sig(SD0, SD1, SI) typeof(_Generic((SI) (0), _0: (SD0) (0), _1: (SD1) (0)))
      #define select2_sig(SD0, SD1, SD2, SD3, SI0, SI1) select_sig(select_sig(SD0, SD2, SI1), select_sig(SD1, SD3, SI1), SI0)
      
      #define add_sig(SDA0, SDB0, SI)  \
          select_sig(                  \
                  xor_sig(SDA0, SDB0), \
                  and_sig(SDA0, SDB0), \
                  SI)
      
      /**
       * ```
       *                      Result selection by index: (SI0, SI1)
       *
       * SDA0 ---------[   ]------------------------ S0  ( 0 ,  0 )
       *               [ + ]
       * SDA1 -.     .-[   ]-.                  .--- S1  ( 0 ,  1 )
       *        \   /         \                /
       *         \ /           "-[   ]--------"
       *          /.             [ + ]
       *         /  \         .--[   ]-.
       * SDB0 --"    "-[   ]."          "-[   ]   .-- C  ( 1 ,  0 )
       *               [ + ]              [ V ]--"
       * SDB1 ---------[   ]--------------[   ]     - 0  ( 1 ,  1 )
       * ```
       */
      Ответить
      • #define add2_sig(SDA0, SDA1, SDB0, SDB1, SI0, SI1)                                \
            select2_sig(                                                                  \
                    add_sig(SDA0, SDB0, _0),                                              \
                    add_sig(add_sig(SDA0, SDB0, _1), add_sig(SDA1, SDB1, _0), _0),        \
                    or_sig(add_sig(add_sig(SDA0, SDB0, _1), add_sig(SDA1, SDB1, _0), _1), \
                           add_sig(SDA1, SDB1, _1)),                                      \
                    false_sig,                                                            \
                    SI0, SI1)
        
        void foo(int x) {}
        void bar(void) {}
        double bar2(int x, int y) { return 0.0; }
        
        int main() {
            printf("%d\n", is_string_v("123"));
            printf("%d\n", is_string_v(123123));
            printf("%d\n", has_signature_v(foo, void, int));
            printf("%d\n", has_signature_v(bar, void, int));
            printf("%d\n", has_signature_v(bar2, void, int));
            printf("%d\n", has_signature_v(bar2, double, int, int));
        
            has_signature_t(bar2, double, int, int) x;
        
            printf("%s\n", to_string(x));
        
            has_same_type_t(&bar2, &bar2) y1;
            has_same_type_t(&bar2, &foo) y2;
            has_same_type_t(1, 1) z;
        
            is_same_t(typeof(&bar2), typeof(&bar2)) z1;
            is_same_t(typeof(&bar2), typeof(&foo)) z2;
            is_same_t(int, typeof(&foo)) z3;
            is_same_t(true_t, true_t) z4;
        
            and_t(true_t, false_t) aa;
        
            printf("%s\n", to_string(bool_v(and_t(true_t, false_t))));
            printf("%s\n", to_string(bool_v(and_t(true_t, true_t))));
        Ответить
        • auto xxx = (void (*)(int))(0);
              auto xxxx = (SignatureM(void, int))(0);
              auto xxxxx = bool_v(has_same_type_t(xxx, xxxx));
              auto джигурда = bool_v(has_same_type_t((typeof(xxx(3)) *) (0), (void *) (0)));
              auto джигурда2 = bool_v(has_same_type_t((typeof(((void (*)(int))(0))(3)) *) (0), (void *) (0)));
              auto _ = bool_v(is_same_t(result_t(xxx, 42), result_t(xxxx, 4242)));
          
              auto _______ = (true_sig) (0);
              auto ________ = (false_sig) (0);
              auto _________ = (not_sig(false_sig))(0);
              auto __________ = bool_v(is_same_sig_t(not_sig(false_sig), true_sig));
              auto ___________ = (and_sig(true_sig, false_sig))(0);
          
              auto s1 = bool_sig_v(true_sig);
              auto s2 = bool_sig_v(not_sig(false_sig));
              auto s3 = bool_sig_v(and_sig(true_sig, false_sig));
          
              auto select1 = bool_sig_v(select_sig(true_sig, false_sig, _1));
              auto select2 = bool_v(is_same_sig_t(select_sig(true_sig, false_sig, _0), true_sig));
          
              auto add1 = bool_sig_v(add_sig(true_sig, true_sig, false_sig));
              auto add2 = bool_sig_v(add_sig(true_sig, true_sig, true_sig));
          
              auto add30 = bool_sig_v(add2_sig(_1, _1, _1, _1, _0, _0));
              auto add31 = bool_sig_v(add2_sig(_1, _1, _1, _1, _0, _1));
              auto add32 = bool_sig_v(add2_sig(_1, _1, _1, _1, _1, _0));
              auto add33 = bool_sig_v(add2_sig(_1, _1, _1, _1, _1, _1));
          
              printf("%d %d %d %d\n", bool_v_to_int(add33), bool_v_to_int(add32), bool_v_to_int(add31), bool_v_to_int(add30));
          
              return 0;
          }
          Ответить
    • У TRUE и у FALSE разные типы — это уже не по-сишному. Это уже ООП какое-то или функциональщина.

      Да, _Generic() — нереально крутая конструкция.
      Ответить

    Добавить комментарий