Кресты / Говнокод #11360 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Xom94ok, (Updated )

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

  • Ну, не совсем говно-то. Хотя, семантика странновата.
    Ответить
  • Вот что тут плохо - ассерт в сообщении об ошибке будет показывать именно строку 7, а не строку 19. Поэтому сообщение становится довольно бесполезным... Видим что нулл, а где - а хрен бы знал, бектрейсов нет.
    Ответить
      • 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);
    Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8