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

    +5

    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
    #include <iostream>
     
    using namespace std;
     
    void f(void){cout<<"f"<<endl;}
    void f1(void){cout<<"f1"<<endl;}
     
    bool secondIfIsTryed(){cout<<"secondIfIsTryed"<<endl;return true;}
     
    #define asserts(Condition) {cout<<"Assert"<<endl;}
     
    int main() {
        if(true)
            if(secondIfIsTryed() && false)
                f();
            else
                f1();
        
        if(true)
            if(secondIfIsTryed() && false)
                asserts(true)
            else
                f1();
        return 0;
    }

    Помните того вечно сомневающегося знакомого, тест крестов, написанный которым я недавно приводил?
    http://ideone.com/9Q61D1
    В этот раз под его глуповатый, но пытливый взгляд попал макрос ассерта. Написан он конечно не так, как в этом тесте, но имеет код вида:

    #define asserts(Condition) {/*...*/}


    В итоге он сделал умозаключение: "Вокруг меня собрались голубцы" и надулся.

    Запостил: LispGovno, 19 Июля 2013

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

    • Он не говорит, но у меня есть подозрение, что он ожидал, что
      else
                  f1();
      начнет принадлежать внешнему ифу из-за этого ассерта. Ассерт самописный в проекте.
      Ответить
      • С чего это он будет внешнему if пренадлежать? Даже я, нуб в Си и плюсях, без компиляции понял, что выполнится f1() в обоих случаях.
        Ответить
    • Некрасиво же, после assert ; не поставишь. Почему не написать do {/*...*/} while(0)?
      Ответить
      • схуяли не поставишь? или ты про без скобок?)
        Ответить
        • И со скобками и не поставишь, и без скобок не поставишь ;) Работать будет только если после if'а тоже ставить скобки if (x) { assert(x); }. Или ты думаешь от хорошей жизни люди оборачивают макросы в do .. while?

          https://ideone.com/y52PvT
          Ответить
          • P.S. Заповеди макроёбства:
            1) Не пиши макросы.
            2) Если все-таки написал макрос - пиши его имя капсом.
            3) Аргументы макроса оборачиваются в скобки.
            4) Тело function-like макро оборачивается в скобки.
            5) Тело statement-like макроса оборачивается в do { ... } while (0).
            6) По возможности аргументы макро используются ровно 1 раз.

            Вроде ничего не забыл. Нарушение любой из этих заповедей почти всегда приводит к грустным последствиям.
            Ответить
            • Ты тут вместо Петросяна?
              Ответить
            • 1) Не пиши макросы.
              2) Если все-таки написал макрос - сотри.
              Ответить
              • 1) Роман Кашицын -пидор
                2) Если не согласен см. п. 1
                Ответить
            • говночую этого анона
              У меня в проекте есть statement-like макро, не обернтый в do { ... } while (0). Использовался сотни раз. Обернуть его в do { ... } while (0) теперь боюсь, так как боюсь что-нибудь сломать
              Ответить
              • От добавления do while, имхо, хуже не станет. Разве что вылезут ошибки компиляции при кривых применениях (без ";").

                Предлагаю для начала посмотреть много ли раз он юзается, и в каких контекстах. А там уже видно будет - рефакторить или не рефакторить.
                Ответить
    • не помним
      Ответить

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