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

    +1004

    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
    // shit.h :
    
    #if END_SHIT == 0
    bagor++;
      #if BIT0 == 0
        #undef  BIT0
        #define BIT0 1
      #else
        #undef  BIT0
        #define BIT0 0
        #if BIT1 == 0
          #undef  BIT1
          #define BIT1 1
        #else
          #undef  BIT1
          #define BIT1 0
          #if BIT2 == 0
            #undef  BIT2
            #define BIT2 1
          #else
            #undef  BIT0
            #undef  BIT1
            #undef  BIT2
            #define END_SHIT 1
          #endif
        #endif
      #endif
      #include "shit.h"
    #endif
    
    //shit.c
    
    #include <stdio.h>
    
    int main(void) {
      int bagor = 0;
      #define BIT0 0
      #define BIT1 0
      #define BIT2 0
      #include "shit.h"
      printf("bagor = %i\n", bagor);
      return 0;
    }

    http://govnokod.ru/20947#comment348047
    CHayT 3 часа назад # 0
    > нет ни циклов, ни рекурсий

    Можно, думаю, файлы сами в себя инклудить, чем не рекурсия. Не очень понятно, что с этим делать, правда.

    -----

    Но ведь совершенно очевидно, что с этим можно делать. Очередной шедевр макроговна

    Запостил: j123123, 25 Августа 2016

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

    • Какой багор )))
      Ответить
    • Какой багор )))
      Ответить
    • Если это компилится и работает как я думаю, то чёрт... гениально.

      Надо факториал накорябать. А программу конфигурировать флагами препроцессора, на этапе конпеляции.
      Ответить
      • Какой багор )))
        Ответить
      • > Если это компилится и работает как я думаю, то чёрт... гениально.

        а если это еще попробовать c boost PP скомбинировать.

        PS гцц:
        # 2 "shit.c" 2
        
        int main(void) {
          int bagor = 0;
        
        
        
        # 1 "shit.h" 1
        
        bagor++;
        # 26 "shit.h"
        # 1 "shit.h" 1
        
        bagor++;
        # 26 "shit.h"
        # 1 "shit.h" 1
        
        bagor++;
        # 26 "shit.h"
        # 1 "shit.h" 1
        
        bagor++;
        # 26 "shit.h"
        # 1 "shit.h" 1
        
        bagor++;
        # 26 "shit.h"
        # 1 "shit.h" 1
        
        bagor++;
        # 26 "shit.h"
        # 1 "shit.h" 1
        
        bagor++;
        # 26 "shit.h"
        # 1 "shit.h" 1
        
        bagor++;
        # 26 "shit.h"
        # 1 "shit.h" 1
        # 27 "shit.h" 2
        # 27 "shit.h" 2
        # 27 "shit.h" 2
        # 27 "shit.h" 2
        # 27 "shit.h" 2
        # 27 "shit.h" 2
        # 27 "shit.h" 2
        # 27 "shit.h" 2
        # 9 "shit.c" 2
          printf("bagor = %i\n", bagor);
          return 0;
        }
        Ответить
        • > а если это еще попробовать c boost PP скомбинировать.

          Да, подкинь им эту идею, чтобы они подобным макроговном пробили очередное дно
          Ответить
          • > подкинь им эту идею
            http://www.boost.org/doc/libs/1_38_0/libs/preprocessor/doc/ref/include_self.html
            
            > © Copyright Housemarque Oy 2002
            > © Copyright Paul Mensonides 2002
            Ответить
            • М-ммммм )))
              Ответить
            • http://www.boost.org/doc/libs/1_50_0/boost/preprocessor/iteration/self.hpp
              http://www.boost.org/doc/libs/1_50_0/boost/preprocessor/iteration/detail/self.hpp


              Эмм, и как этим сделать конечное число повторов чего-либо?
              Ответить
              • Но зачем? Бесконечный цикл всё равно рано или поздно надо будет прибить каким-нибудь таймаутом. Или генерация бесконечных исходников - безумно ценная фича, как гомоиконы?
                Ответить
                • > Бесконечный цикл всё равно рано или поздно надо будет прибить каким-нибудь таймаутом.

                  Инклудить файл сам в себя в бесконечном цикле и прибивать препроцессор по таймауту для генерации исходников? Сурово! Надо только на этапе компиляции еще узнать модель и частоту процессора, чтоб в нужное время прибить, а то еще чего лишнего нагеренирует, или недогенерирует.

                  >Или генерация бесконечных исходников - безумно ценная фича, как гомоиконы?

                  Приведенный мной говнокод генерирует как раз конечный исходник
                  Ответить
                  • Пардон, в глаза няшусь. Увидел "как сгенерить бесконечное число повторов".
                    Ответить
    • ты не на си это написал, а на препроцессоре
      Ответить
      • Какой багор )))
        Ответить
      • М-ммммм )))
        Ответить
        • Ура, хоть какое-то разнообразие.
          Ответить
      • Только тут нет отдельного раздела для препроцессора. И вообще, там main() и printf() есть, значит это определенно C или C++
        Ответить
        • орлы?
          function main() {
          
          }
          function printf() {
          // я JSная макака
          }
          Ответить
          • только там препроцессора нет
            Ответить
            • в роту?
              Ответить
            • Препроцессора нет, но вы держитесь. Хорошего вам настроения!
              Ответить
              • показать все, что скрытоСтоит отметить, что, если ехать в секс-тур по Камеруну, то языкового барьера между мною и тамошними шоколадными зайцами не возникнет, ибо говорят там по-английски; а уж я с мало-мальским знанием английского языка завсегда смогу прокричать "Deeper, deeper!", верно?
                Ответить
        • Хотя это еще может быть obj-c и obj-c++
          Ответить
          • cpp можно гонять на любых (текстовых?) файлах. Так же, как PHP можно использовать как препроцессор для С/C++ (что, возможно даже резонно)
            Ответить
            • > cpp можно гонять на любых (текстовых?) файлах.

              Вообще да, но гоняют его обычно на C/C++/Obj-C/Obj-C++
              Ну и еще он вроде используется применительно к исходникам на ассемблере GAS. Больше не могу ничего такого вспомнить, если говорить о дефолтном применении
              Ответить
              • а правда же классно что препроцессором сишечки стал cpp а не m4?
                хохохо, представляю какой сейчас был бы бугурт!
                Ответить
                • Держите:
                  http://govnokod.ru/13492#comment189861

                  m4 всё-таки универсальнее. В нём хоть какие-то вычисления можно делать, в отличие от cpp.
                  Ответить
                  • блядь, обычно все ненавидят sendmail за m4, а ты его к ЯП прикрутил
                    Ответить
                    • Как сказал Борманд, самая пидорастичная часть сендмейла не в m4, а глубже.

                      В m4 хотя бы есть инкремент и декремент, а в cpp приходится строить монстра, похожего на компьютер из Майнкрафта.
                      Ответить
                      • она в рулах, да)

                        просто m4 сам по себе ломает мозг
                        может быть в 1979м году он и был няшечкой, но сейчас на таком не программируют
                        Ответить
                        • Его и сейчас используют во всяких autoconf/automake. Но за пределы GNU Build System он обычно не распространяется.
                          Ответить
                  • Забавно кстати!

                    Раньше препроцессор был маст хев всегда и везде. А теперь нет.
                    Новые ЯПы без него как-то обходятся. Чому так?
                    Ответить
                    • Новые ЯПы стали хитрее. Когда Керниган и Ритчи создавали Си, основным требованием было, чтобы компилятор работал быстро и тратил мало памяти. Это позже Борланд всех шокировал быстрым компилятором Бейсика, диалекта Паскаля и (о, боже) Пролога (до этого вообще думали, что Пролог может быть только интерпретируемым), а потом и другие компании и языки примкнули. А тогда, в семидесятых, трудно было быть первопроходцем, потому и не смогли обойтись без препроцессора.
                      Ответить
                    • Кстати, сейчас в качестве препроцессора для Си можно использовать PHP:
                      http://govnokod.ru/14175#comment203408
                      Ответить
                      • Можно и питон
                        http://nedbatchelder.com/code/cog/
                        http://we.easyelectronics.ru/MrYuran/avtogeneraciya-koda-ili-uletnye-shablony-v-si.html
                        Ответить
                        • Как-то скучно. С тем же успехом можно было тупо высрать эту таблицу в stdout хоть питоном хоть сишкой и заинклудить полученный хедер. Даже проще и нагляднее было бы, и без внешней либы...

                          Или в ней что-то ещё интересное есть помимо cog.out?
                          Ответить
            • >текстовых
              Сразу захотелось использовать для, скажем, рассказа - для кастомизируемости и создания нескольких версий.

              ...MANIAC убил ADULT(и изнасиловал) VICTIMS_COUNT женщин...

              где
              #define MANIAC Чикатило
              #define VICTIMS_COUNT 8
              
              #ifdef FOR_KIDS
              #define ADULT(T)
              #else
              #define ADULT(T) T
              #endif
              Ответить
    • https://github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms
      Ответить
    • Си не нужен
      Ответить

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