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

    +2

    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
    99. 99
    //macrolib.h
    
    #ifndef MACRO_LIB
    #define MACRO_LIB
    
    #include <stdio.h>
    
    typedef void proc(void);
    
    #ifdef DEBUG
      #define TRACE printf
    #else
      #define TRACE(...)
    #endif
    
    #ifdef TRACE_CALLS
      #define ON_ENTER_TRACE(name) char __CUR_FUNC_NAME__[] = #name; TRACE("<entering %s>", __CUR_FUNC_NAME__);
      #define ON_EXIT_TRACE(...) TRACE(__VA_ARGS__)
    #else
      #define ON_ENTER_TRACE(name) ;
      #define ON_EXIT_TRACE(...)
    #endif
    
    #define def(type, name, ...) type name __VA_ARGS__ { ON_ENTER_TRACE(name)
    #define ret(ret_val) {ON_EXIT_TRACE("<leaving %s>", __CUR_FUNC_NAME__); return ret_val;}
    #define end(ret_val) ret(ret_val);}
    
    #define with(type, x, on_exit) { type __CUR_WITH_VAR__ = x; int (*__ON_EXIT__)() = (int(*)())on_exit;
    #define endwith __ON_EXIT__(__CUR_WITH_VAR__);}
    
    #define dup(d, ...) __VA_ARGS__ d __VA_ARGS__
    #define dupwithcomma(...) __VA_ARGS__, __VA_ARGS__
    
    #endif
    
    
    
    
    //chain.h
    
    #ifdef I0
      #undef I0
      #if defined(I1) || defined(I2) || defined(I3)
        ELEMENT DELIMETER
        #include "chain.h"
      #else
        ELEMENT
        #undef ELEMENT
        #undef DELIMETER
      #endif
    #else
      #ifdef I1
        #undef I1
        #define I0
        ELEMENT DELIMETER
        #include "chain.h"
      #else
        #ifdef I2
          #undef I2
          #define I1
          #define I0
          ELEMENT DELIMETER
          #include "chain.h"
        #else
          #ifdef I3
            #undef I3
            #define I2
            #define I1
            #define I0
            ELEMENT DELIMETER
            #include "chain.h"
          #endif
        #endif
      #endif
    #endif
    
    //test.c
    
    #define DEBUG
    #define TRACE_CALLS
    
    #include "macrolib.h"
    
    def(int, main, ())
      printf(dup(" ", "%s"), dupwithcomma("Чот мне понравилось макроёбить..."));
      FILE *f = fopen("file", "w");
      with(FILE*, f, fclose)
        fputs(
          #define ELEMENT "o"
          #define DELIMETER "l"
          #define I3
          #define I2
          #define I1
          #define I0
          #include "chain.h"
          , f
        );
      endwith
    end(0)

    Мне понравилось. то ещё можно намакроёбить? ;D

    Запостил: adrnin, 30 Октября 2018

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

    • #мокро-макро
      Ответить
    • Интерпретатор брейнфака. Во время раскрытия макросов, само собой.
      Ответить
    • Откопал мой несвежий говнокод https://govnokod.ru/20958 ? Или сам додумался?
      Ответить
      • Та Ты Тоже Ебанутый :)
        Я оч долго мучилсо, пока до этого дошол, я думал сперва просто числами считать, но нихуя не вышло, потом конкотенировал идентификаторы, типа:
        #define N nnnnn
        #define I n
        #include "xyuta.h"
        а там:
        
        #if N != I
        #define I I##n
        #include "xyuta.h"
        #endif
        но тож, чот не фурычит :(
        Ответить
        • Ея дебил, внутре девайна макросы не подставляются, только при мокровызове... Ебать как всё примитивно.
          Ответить
          • И именно поэтому появилась конструкция EVAL1(EVAL1(EVAL1(EVAL1 ?

            Как вообще с этим можно работать?
            Ответить
            • Это конструкция нужна чтобы заставить препроцессор ещё несколько раз просканировать аргументы сраного EVAL, чтобы работала косвенная рекурсия, которая делается через макрос OBSTRUCT, но вот что происходит внутрях препорцесора при его раскрытии я пока так и не поняо.
              Ответить
    • На лимит по уровню инклудов налетишь, емнип. Лучше в ширину ветвиться.
      Ответить
    • Ты чем собираешь-то?
      $ gcc -std=c11 test.c -o test
      test.c:1:10: error: unknown type name ‘main’
       def(int, main, ())
                ^~~~
      test.c:1:16: error: expected declaration specifiers or ‘...’ before ‘(’ token
       def(int, main, ())
                      ^
      test.c:3:3: error: unknown type name ‘FILE’
         FILE *f = fopen("file", "w");
         ^~~~
      test.c:3:3: note: ‘FILE’ is defined in header ‘<stdio.h>’; did you forget to ‘#include <stdio.h>’?
      test.c:1:1:
      +#include <stdio.h>
       def(int, main, ())
      test.c:3:3:
         FILE *f = fopen("file", "w");
         ^~~~
      test.c:3:13: warning: implicit declaration of function ‘fopen’ [-Wimplicit-function-declaration]
         FILE *f = fopen("file", "w");
                   ^~~~~
      test.c:3:13: note: ‘fopen’ is defined in header ‘<stdio.h>’; did you forget to ‘#include <stdio.h>’?
      test.c:3:13: warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
      test.c:3:13: error: initializer element is not constant
      test.c:4:8: error: unknown type name ‘FILE’
         with(FILE*, f, fclose)
              ^~~~
      test.c:4:8: note: ‘FILE’ is defined in header ‘<stdio.h>’; did you forget to ‘#include <stdio.h>’?
      test.c:4:15: error: expected declaration specifiers or ‘...’ before ‘f’
         with(FILE*, f, fclose)
                     ^
      test.c:4:18: error: unknown type name ‘fclose’; did you mean ‘float’?
         with(FILE*, f, fclose)
                        ^~~~~~
                        float
      test.c:15:3: error: unknown type name ‘endwith’
         endwith
         ^~~~~~~
      test.c:16:5: error: expected declaration specifiers or ‘...’ before numeric constant
       end(0)
           ^
      Ответить
    • "OBEH" приде -- на "PHP" переведе.
      Ответить
    • Чо мне никто не скозал про макрос __FUNXTION__? Можно красивее переделать:
      #define return(x) {TRACE("<leaving %s>", __FUNCTION__); return (x);}
      
      #define FUN_BODY(...) {TRACE("<entering %s>", __FUNCTION__); __VA_ARGS__; TRACE("<leaving %s>", __FUNCTION__);}
      int main(void) FUN_BODY(
        puts("Hello!");
        return(0);
      )
      Ответить

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