1. Си / Говнокод #2403

    +134.7

    1. 1
    si_node_append(&(*config), si_node_create_ex(param_name, param_value, param_flag)); // ...to the end

    Смысл операции &(*var) непонятен.
    Отдельного внимания заслуживает коментарий... мне удалось воткнуть :) оказывается, имелось в виду не "вперед, до самого конца", а "добавляем в конец списка", ага.

    Правда, был круче комент в одном месте... "redirect of conclusion"...
    В общем, когда вкурил что имелось в виду "перенаправление вывода", чуть не сдох со смеху :)

    Запостил: Pencioner, 14 Января 2010

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

    • Ну config может кагбы быть итереатором..
      Ответить
    • Од черд перепутал, где сдесь с++? =)
      Ответить
    • &(*var)

      Смысл разве что такой. В функцию передается ссылка на безымянную временную переменную, в которой лежит копия того, на что указывает var. То есть, если функция меняет значение первого параметра, значение *var не изменится.
      Ответить
    • Да это чистый си :)

      &(*var) результатом дает значение var
      Того же самого можно получить написав var без извращений :)
      Уж думал, искал тайный смысл... но увы
      Ответить
      • Может, сначала передавался не указатель, а потом оптом все заменили на указатель?
        Лично я люблю по всему коду шило менять на мыло. Автоматически, потому что emacs.
        Ответить
        • скорее всего, но то что человек этот не под емаксом работает, 100%. менял руками, бездумно...
          нельзя так :)
          Ответить
      • народ такое иногда в макросы пихает как проверка на то что параметром передается переменная, а не константа. у констант нет адреса и как следствие компилятор ругатся начинает.

        я подобное иногда пишу когда хочу подчеркнуть что передается нечто по аддресу и как следствие может быть изменено внутри вызываемой функции.
        Ответить
    • Эта конструкция (&(*pointer)) называется "ссылка на указатель". Позволяет изменять не только данные, на которые указывает указатель, но и сам указатель, а точнее адрес, хранящийся в переменной var.
      То есть если имеется следующая процедура :
      void foobar(char *&p) {
         *p = 'X';  //1
         p = NULL; //2
      }
      char c = 'A';
      char * p = &c;
      foobar(p);

      В данном случае, при возврате из функции foobar указатель p будет равен NULL, чего бы не произошло, если бы формальный параметр был объявлен не как char *&p, а как char *p.
      Ответить
      • В си нет ссылок. И в остальном ты нагнал пурги.
        Ответить
      • нифига, в чистых си нет ссылок - раз, во вторых это не декларация переменной, а оператор взятия адреса. адрес обьекта (*ptr) т.е. обекта, размещенного по адресу, указанному указателем ptr, равен ptr. однозначнейше...

        и никакими простите формальными параметрами не пахнет... пахнет особым видом кода только ))))
        Ответить
      • Когда было сказано "это не декларация переменной, а оператор взятия адреса", то имелся в виду тот кусок что я постил а не Ваш кусок кода. в вышеприведенном - это декларация ссылки на указатель. у меня же - унарная операция взятия адреса...
        Ответить
        • Будем считать, что я облажался :)
          А так же, что это не говнокод, а говнорефакторинг =))
          Ответить
      • это вызов функции, а не прототип
        Ответить
    • в первом посте был правильный ответ.
      класс может переопределять опреатор * так как это делает итератор...
      Ответить
      • не обратил внимания что это С... в С++ у меня полно таких конструкций...
        Ответить
      • Гы :) переопределение операторов имхо фетиш Страуструпа и несколько портит в плане механизмов говнокодирования в общем-то хороший язык :)
        Ответить
        • я пользуюсь... мне нравится... очень удобно при написании прокси-классов...
          Ответить
          • Да в самой концепции особо плохого на самом деле нет, но... многие пользуются в ущерб... а ущерб этот часто и приводит к тому что надо всякие штучки типа прокси классов :)

            джаст имхо
            Ответить

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