1. C++ / Говнокод #12839

    +12

    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
    #ifndef __MAKROS_H__
    #define __MAKROS_H__
    // ...
    #define countof( array ) sizeof( array ) / sizeof( array[ 0 ] )
    
    #define IS_CLUSTER( id ) id >= FIRST_CLUSTER_ID
    
    #define CREATE_TEMP_FILE( autoclean_name, file_prefix ) \
        char create_temp_file_file_mask[ MAX_PARAM_STR_LENGTH ]; \
        snprintf( create_temp_file_file_mask, MAX_PARAM_STR_LENGTH, "%s/%sXXXXXX", config::tmp_path, file_prefix ); \
        int create_temp_file_desc=mkstemp( create_temp_file_file_mask ); \
        if(create_temp_file_desc<0) \
    { \
            DEBUG_E( Interface, "Cannot create temporary file: %s\n", create_temp_file_file_mask ); \
            ret=RET_CANTOPENFILE; \
            CHECK_RET(sock, ret); \
            return true; \
    } \
        close(create_temp_file_desc); \
        autoclean autoclean_name( create_temp_file_file_mask );
    
    #endif // __MAKROS_H__

    Это просто праздник какой-то

    Запостил: roman-kashitsyn, 02 Апреля 2013

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

    • >MAKROS
      это были KDEшники?
      Ответить
    • Хоть бы в do { ... } while (0) заключили такую портянку...
      Ответить
      • Зачем? Просто в {...}?

        >while (0)
        Студия начнет выть про константы в условиях цикла.
        Ответить
        • никогда не ныла, а тут вдруг начнет?

          do {} while (0); более чем распространенная схема, например, заменяющая кучку goto error;
          Ответить
        • > Зачем? Просто в {...}?
          Чтобы вызов такого макро работал как вызов самой обычной функции, и требовал ";" после себя, а также нормально интегрировался с ифами и другими управляющими конструкциями. Классика макроебства же.
          1) Все аргументы заворачиваем в круглые скобки
          2) Если пишем выражение - оборачиваем всего макро круглые скобки
          3) Если пишем стейтмент - оборачиваем его в do { ... } while (0)

          > Студия начнет выть про константы в условиях цикла.
          И пошла она нахуй со своим вытьем. Лучше бы полезные ворнинги показывала.

          P.S. А с {} она всяко будет вопить про лишнюю ";".

          P.P.S. На while (true) { ... if (x) break; ... } тоже воет? Если да - то говно эта ваша вижуалка.
          Ответить
          • #dedine MACROS(...) if(0){}else{макрос тело}
            И студия наезжать не будет
            Ответить
            • > if (0) же.
              Так тут же тоже константа в условии. Почему на тот случай она вопит а на этот нет? Вот срань то...

              На while (true) { ... if (x) break; ... } тоже воет? Это ведь вполне нормальная конструкция. Да и нолик в условии\цикле, появившийся в результате макроэкспанда или вычисления констант тоже как бы нормальная практика.
              Ответить
              • любители /W4 продолжают жрать кактус
                Ответить
                • Кстати, а визуалка до сих пор на /W4 срёт ворнингами о своих же хидерах? Или в новых все хорошо?
                  Ответить
                  • не знаю, я не настолько упорот, чтобы на /W4 компилять
                    пока дерьмотюнинг не сделаешь -D_SCL_SECURE_NO_WARNINGS она и на /W3 будет изрыгать тонны проклятий в адрес std::copy
                    Ответить
                    • КРЕСТОПРОБЛЕМЫ.
                      В плюсах нет возможности отключить определенный ворнинг в определенном месте. Есть конечно pragma, но оно же прибито к крестокомпилятору
                      Ответить
                      • тут то как раз очень даже конкретный компилятор
                        слава микрософту
                        Ответить
                  • Да, она до сих пор весьма самокритична.
                    Ответить
          • for(;;) надо писать шоб не ныла
            Ответить
            • Пиздец. Этот ктулху-смайлик вместо понятного и красивого while (true)/while (1)? Да я лучше begin: ... goto begin буду писать, чем эту срамоту.

              Вот у визуалки хороший компилятор - быстрый, код получается компактней чем у гцц. Простим уж ей неподдержку С99... Но с ворнингами у нее полная жопа. Те, которые надо, она не показывает. Ненужные - пожалуйста, тысячами. Вот кому нахуй сдались ворнинги про "устаревание" "небезопасных" сишных функций, и предложение взамен юзать анально огороженную замену от майкрософта? Кому интересны сотни ворнингов в хедерах самой визуалки? Даже опенсурсное gcc их по дефолту не показывает, зная, что никто их править не будет.
              Ответить
              • >Простим уж ей неподдержку С99
                а вот неподдерджку С++11 уже прощать не хочется. А в экспериментальной ветке gcc есть даже концепты
                Ответить
    • > Это просто праздник какой-то
      Никак группу КРЕМАТОРИЙ переслушал? Притом такая редкая запись.
      Ответить
      • Может всёже группа Тайм Аут цитировали фразу Этуша в роли Карабаса-Барабаса из киноленты "Буратино"? Или я чего-то не знаю?
        Ответить
    • Каждый раз когда я вижу такой чудесный макрос хочется отдать автора специальнообученной команде негров гомосексуалистов на кххм - перевоспитание.
      Ответить
    • мощный макрос.. Объясните плиз - в чем гуана (не считая lower-case для countof)
      >#define countof( array ) sizeof( array ) / sizeof( array[ 0 ] )
      Ответить
      • С countof почти всё нормально, не хватает лишь нескольких пар скобок:
        #define countof( array ) ( sizeof( (array) ) / sizeof( (array)[ 0 ] ) )
        Ответить
        • поначалу хотел это же написать, а потом понял, что не могу представить себе ситуации, когда скобки спасут положение
          Ответить
          • Use imagination, Luke!
            // http://ideone.com/MuChIp
            #include <cstdio>
            
            #define countof( array ) sizeof( array ) / sizeof( array[ 0 ] )
            #define ARRAY_SIZE( array ) ( sizeof( (array) ) / sizeof( (array)[ 0 ] ) )
            
            int main()
            {
                int a[20];
                int b[60];
                std::size_t slice_count_1 = countof(b) / countof(a);
                std::size_t slice_count_2 = ARRAY_SIZE(b) / ARRAY_SIZE(a);
                std::printf("countof: %lu, array_size: %lu\n", slice_count_1, slice_count_2);
                return 0;
            }
            0 vs 3
            Ответить

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