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

    +137

    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
    #define SPLICE(a,b) SPLICE_1(a,b)
    #define SPLICE_1(a,b) SPLICE_2(a,b)
    #define SPLICE_2(a,b) a##b
     
     
    #define PP_ARG_N( \
              _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, _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, _35, _36, _37, _38, _39, _40, \
             _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
             _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
             _61, _62, _63, N, ...) N
     
    /* Note 63 is removed */
    #define PP_RSEQ_N()                                        \
             62, 61, 60,                                       \
             59, 58, 57, 56, 55, 54, 53, 52, 51, 50,           \
             49, 48, 47, 46, 45, 44, 43, 42, 41, 40,           \
             39, 38, 37, 36, 35, 34, 33, 32, 31, 30,           \
             29, 28, 27, 26, 25, 24, 23, 22, 21, 20,           \
             19, 18, 17, 16, 15, 14, 13, 12, 11, 10,           \
              9,  8,  7,  6,  5,  4,  3,  2,  1,  0
     
    #define PP_NARG_(...)    PP_ARG_N(__VA_ARGS__)    
     
    /* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
    #define PP_NARG(...)     PP_NARG_(_, ##__VA_ARGS__, PP_RSEQ_N())
     
    #define NARG(...)     func(PP_NARG(__VA_ARGS__), __VA_ARGS__)
     
    #define INCR 20
     
    #define FIELD_0(...)
     
    #define FIELD_1(field, ...) \
      INCR+field
     
    #define FIELD_2(field, ...) \
      INCR+field, FIELD_1(__VA_ARGS__)
     
    #define FIELD_3(field, ...) \
      INCR+field, FIELD_2(__VA_ARGS__)
     
    #define FIELD_4(field, ...) \
      INCR+field, FIELD_3(__VA_ARGS__)
     
    #define FIELD_5(field, ...) \
      INCR+field, FIELD_4(__VA_ARGS__)
     
    #define FIELD_5(field, ...) \
      INCR+field, FIELD_4(__VA_ARGS__)
     
    #define FIELD_6(field, ...) \
      INCR+field, FIELD_5(__VA_ARGS__)
     
    #define FIELD_7(field, ...) \
      INCR+field, FIELD_6(__VA_ARGS__)
     
    #define FIELD_8(field, ...) \
      INCR+field, FIELD_7(__VA_ARGS__)
     
    #define FIELD_9(field, ...) \
      INCR+field, FIELD_8(__VA_ARGS__)
     
    #define FIELD_10(field, ...) \
      INCR+field, FIELD_9(__VA_ARGS__)
     
    #define FIELD_11(field, ...) \
      INCR+field, FIELD_10(__VA_ARGS__)
    //..... дальше лень ...
     
    #define FIELDS_(N, ...) \
      SPLICE(FIELD_, N)(__VA_ARGS__)
     
    #define FIELDS(...) \
      FIELDS_(PP_NARG(__VA_ARGS__), __VA_ARGS__)
     
     
    a = { FIELDS('p', 'a', 's', 's', 'w', 'o', 'r', 'd') }

    Примитивное компил-тайм шифрование строки через сишный препроцессор. На выходе получаем

    a = { 20 +'p', 20 +'a', 20 +'s', 20 +'s', 20 +'w', 20 +'o', 20 +'r', 20 +'d' };

    Базируется на http://smackerelofopinion.blogspot.com/2011/10/determining-number-of-arguments-in-c.html

    Запостил: j123123, 06 Февраля 2014

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

    • Слабые в вашей сишке макросы, вот в лиспе – другое дело)
      Ответить
    • Хреновое шифрование, реквестирую compile-time AES на макросах ;)
      Ответить
      • Дело было вечером, делать было нечего.

        https://github.com/bormand/ct_aes
        Compile-time AES. Правда не на макро.
        Ответить
        • - страдаете от безделья?
          - что вы, наслаждаюсь.
          Ответить
          • Да скучно стало с этим с++11, все довольно тупо и механически портанулось :( Из интересных вещей тут только связка seq + gen_seq, да и ту нагуглил.
            Ответить
      • > compile-time AES на макросах ;)

        https://github.com/bormand/pp_aes

        Welcome to the hell.
        Ответить
    • А вроде как в 11м добавили вычисление некоторых выражений в compile-time?
      Ответить
      • Да оно и в с++98 возможно было, просто смотрелось как говно. Правда его нельзя было юзать как ключ в switch'е, и еще где-то, запамятовал где.

        http://ideone.com/x72uo5
        Ответить
        • Можно же использовать как ключ в свиче. Студия проглатывала
          Ответить
          • Хм, и gcc в режиме -std=c++98 тоже съел case sum_mod256<1, 2>::value. Значит моя инфа устарела ;(
            Ответить
        • вот так точно скомпилится везде http://ideone.com/abOp1i.
          const int студия не всегда проглатывает как размер массива.
          Ответить
          • Пушкоф, какими судьбами к нам? Как тесен мир.
            Ответить
            • на ГД.ру забанили за политику. хотел из хабра вставить бесконечный цикл в конструкторе, заметил что он тут уже есть.
              Ответить
              • А где этот цикл? Ссылку на говнокод и хабр пришли. А сайт гд - лажовый. Я туда больше не ногой. Буду только мстить тамошним обитателям.
                Ответить
              • PS: Загляни в соседний по стоку тред и поясни тарасу нравится ли тебе функциональный стиль или нет.
                Ответить
                • я сейчас люблю функциональный стиль. мне уже не страшно передать в функцию 100500 параметров, лишь бы не заводить класс и не трогать глобальные данные
                  Ответить
                  • > мне уже не страшно передать в функцию 100500 параметров
                    А в функции передать функции с частично забиндеными параметрами и тд?

                    Ну и почему тебе объекты не нравятся? Без них твой код превратиться в лапшу
                    Ответить

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