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

    +15

    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
    #pragma once
    #include <assert.h>
     
    template<typename T>
    inline T notNull(T arg)
    {
            assert(arg!=NULL);
            return arg;
    }
     
    /*
    //example:
    class AnotherClass;
    
    class SomeClass
    {
    AnotherClass * m_another;
    //...
            SomeClass(AnotherClass * another, /*skipped*/) : m_another(notNull(another)), /*skipped*/;
    }
    */

    Мелочь, конечно же, но всё-таки чушь, несмотря на пользу.

    Запостил: Xom94ok, 04 Июля 2012

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

    • Ну, не совсем говно-то. Хотя, семантика странновата.
      Ответить
    • Вот что тут плохо - ассерт в сообщении об ошибке будет показывать именно строку 7, а не строку 19. Поэтому сообщение становится довольно бесполезным... Видим что нулл, а где - а хрен бы знал, бектрейсов нет.
      Ответить
      • #define notNull(arg) (assert(arg!=NULL), arg)
        Ответить
        • arg вычисляется два раза. Для случая в топике сойдет, а на чем-то более сложном чем переменная - сломается:
          x = notNull(allocateObject(...)); // allocateObject() вызовется 2 раза

          Еще в подобных макросах обязательны скобки вокруг arg. То, что в данном случае туда не будут передавать что-то с операторами - неважно. Кто-нибудь когда-нибудь найдет способ, как передать туда что-то этакое.
          Ответить
    • вот молодец, что закомментировал
      Ответить
    • А как вам вот такой вариант?
      #include <iostream>
      #include <cstdlib>
      
      template <typename T>
      T assertNotNull(T p, const char *expr)
      {
          if (p == NULL)
          {
              std::cerr << "Assertion failed: " << expr << std::endl;
              abort();
          }
          return p;
      }
      
      #define I_HATE_MACRO2(x) #x
      #define I_HATE_MACRO(x) I_HATE_MACRO2(x)
      #define notNull(p) assertNotNull(p, #p " is NULL at " __FILE__ ":" I_HATE_MACRO(__LINE__))
      Ответить
    • прикольный прием.
      а то я все по старинке
      assert(p!=0);
      doSomeWithP(p);
      Ответить

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