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

    +160

    1. 1
    typedef _My unsigned int UINT_PTR, *PUINT_PTR;

    Запостил: Говногость, 17 Августа 2011

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

    • Фу, говнище.
      Ответить
      • показать все, что скрытоПричём в основном - из-за языка программирования!
        Ответить
        • Заклинание, вызывающее TarasB?

          Кстати, где здесь С++?
          Ответить
          • Это Си!
            Ответить
            • Si.
              Ответить
              • Кстати, не могу понять непоследовательность Си. В операторе присвоения вычисляемое выражение находится в правой части, а переменная, значение которой нужно заменить, — в левой. В операторах же typedef и объявления переменных конструктор находится в левой части, а определяемый идентификатор — в правой. Не находите противоречия?

                Си:
                typedef int my_type[9001]; // тут неизвестное справа
                my_type my_var; // и тут неизвестное справа
                my_var[0] = 100500 / 265; // а тут неизвестное внезапно слева

                Паскаль:
                type my_type = array [0..9000] of integer; { тут неизвестное слева }
                var my_var: my_type; { и тут неизвестное слева }
                begin
                  my_var[0] := 100500 / 265 { и даже тут неизвестное слева }
                end;

                Да, кстати, конструкция, когда размер массива, намёк на указатель или аргументы функции описываются не в конструкторе типа, а пририсовываются к определяемому идентификатору, рвёт мозг.
                Ответить
                • Никакой непоследовательности нет. Объявления новых типов строятся по той же схеме, что и объявления переменных, т.е. с идентификатором связывается тип, которым бы обладала объявленная таким образом переменная.
                  Примерчик:
                  typedef int (*comparator)(void *, void *);
                  
                  int bogus_compare(void *a, void *b)
                  {
                      return 0;
                  }
                  
                  int main()
                  {
                      comparator my_comparators[] = {bogus_compare};
                      return 0;
                  }
                  Ответить
                  • Кажется, понял. Объявление переменных и присвоение в Си сделали в противоположные стороны, чтобы красиво выглядела конструкция с одновременным объявлением и присвоением:
                    comparator my_comparators[] = {bogus_compare};

                    А как тогда будет выглядеть эта строка, если нужно объявить массив из N элементов, а инициализировать только один элемент?
                    Ответить
                    • Очевидно,
                      const int N = 10; /* ANSI C 99 detected */
                      comparator my_comparators[N] = {bogus_compare, null};

                      можно оставить предыдущую правую часть, но тогда у нас будет N одинаковых элементов bogus_compare. В текущем варианте один bogus_compare и N-1 нуллов.
                      Ответить
                    • Да, кстати, без typedef'а это можно было бы записать вот таким изящным образом:
                      int (*my_comparators[])(void *, void *) = {bogus_compare};
                      Ответить
    • Что скрывается за _My ?
      Ответить
    • typedef _MyMy unsigned int UINT_PTR, *PUINT_PTR;
      Ответить
    • показать все, что скрытоvanished
      Ответить

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