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

    +68.1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    void TInputTID::AvWnd(GtkWidget* w, char* name, int bOut, void (*cb) (int wnd, int data))
    {
        // Тут объявления локальных переменных и не относящиеся к делу манипуляции
        if(((int)cb) != -1) // Шедевр
        {
          gtk_signal_connect ((GtkObject*)hButOK,
                               "clicked",GTK_SIGNAL_FUNC(cb),hOutWndBox);
        }
    }

    Вечное сияние чистого разума. Новое слово в арифметике указателей.

    Запостил: mutanabbi, 13 Февраля 2010

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

    • Расскажите афтару про null и зачем он нужен.
      Ответить
      • показать все, что скрытоАвтор мог рассматривать 3 различных случая: cb == NULL, (int)cb == -1 и cb - адрес существующей функции, так что тут всё может быть нормально.
        Ответить
        • Отрицательный адрес? Отжигаешь!
          Ответить
          • Посмотрите, например, вот сюда: http://beej.us/guide/bgipc/output/html/multipage/shm.html

            Или можете просто прочитать man shmat в любой UNIX-like системе, секцию RETURN VALUES.
            Ответить
            • Кто спорит? Указатель может быть преобразован к интегральному типу. Где-то в низкоуровневом коде это возможно даже и оправдано. Но:

              a) автор не имеет отношения к написанию кода ядра какой-либо UNIX-like системы или интерфейса к оному
              b) мы говорим НЕ о return value которое может быть проинтерпретировано как "признак ошибки" (что и используется в shmat)
              c) приведенный в качестве примера системный вызов ни фига не является примером хорошего проектирования
              d) в данном случае речь идет даже не об указателе, а об указателе на функцию
              e) даже если предположить, что сабскрайберу просто АЦЦКИ НЕОБХОДИМО уметь передовать признак "не подписывать ни на что" всегда есть NULL-поинтер
              f) это вообще-то высокоуровневый c++ код, где не должно быть грязных хаков с упаковкой данных в указатели
              g) вышеприведенное разве не очевидно?
              Ответить
        • Ну какбэ если нужно было хоть 10 вариантов рассматривать, то можно на крайняк использовать 1, 2 и тд -- unsigned, понимаешь? Не нужно это конвертить, т.к. указатели =1 и тд невалидные все равно.
          Ответить
    • IMO там "(long)" вместо "(int)" должен быть. хотя даже так портабельнасть ограничена. нужно реально "(unsigned long)" и "-1ul" писать. а еще лучше макрос/inline функцию для проверки.

      NULLами может не пользуются потому что e.g. gtk_signal_connect() их специально обрабатывает.
      Ответить
      • -1ul
        ((unsigned long)-1))))))))))))))))))))))
        Ну отжёг. ))))))))))))))))))
        Ответить
    • вы просто не вкурсе как это всё устроено внутри сишного gtk :D в glib (не путать c glibc) есть например такие дефайны:

      GINT_TO_POINTER
      GPOINTER_TO_INT

      догадайтесь что делают :) вот тут тот самый случай, когда приходится идти на поводу у создателей Gtk
      Ответить

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