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

    +163

    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
    22. 22
    23. 23
    #include <stdio.h>
    
    const int (&getArray())[10] {
      static int tmp[10] = {1,2,3,4,5,6,7,8,9,10};
      return tmp;
    }
    
    void foo(const int (&refArr)[10])
    {
      size_t size = sizeof(refArr); // returns 10*sizeof(int)
      printf ("Array size: %d\r\n", size);
    }
    
    
    int main() {
      foo(getArray());
    
      printf ("%d", getArray()[0]);
      for (size_t i=1; i<sizeof(getArray())/sizeof(getArray()[0]); ++i)
        printf (",%d", getArray()[i]);
        
      return 0;
    }

    http://codepad.org/rPl6b7IS

    c++ страшный язык :)
    Извращения на тему: http://heifner.blogspot.com/2005/06/c-reference-to-array.html

    Запостил: Aleskey, 30 Июня 2011

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

    • или даже так:
      const int (&refArr)[10] = getArray();
      printf ("%d", refArr[0]);
      Ответить
      • const int (&getArray())[] {
          static int tmp[] = {1,2,3,4,5,6,7,8,9,10};
          return tmp;
        }
        А так можно?
        Ответить
        • error: invalid initialization of reference of type 'const int (&)[]' from expression of type 'int [10]'
          Ответить
          • Жаль. Конструкция стала ещё менее удобной...
            Ответить
    • Только вот зачем это всё, но прикольно...
      Оператор индексного доступа или оператор каста объекта в массив на порядок полезнее. Забавен ещё оператор каста объекта в функцию (не оператор скобочки, а именно преобразования объекта в функцию).
      Ответить
      • Например, если нужно при статической инициализации получить доступ к массиву в отдельном копилейшн юните, описанным способом можно защититься от static initialization order fiasco.

        Это к вопросу зачем зарывать массив в функцию
        Ответить
        • >static initialization order fiasco
          Поподробнее можно? Видимо, для исправления порядка инициализации статических данных?
          Ответить
          • Да забей, не подумав ляпнул. От static initialization order fiasco помогает заворачивание в функцию, а как массив наружу передаётся -- это уже второстепенно.

            Вообще про явление читай в с++ faq.
            Ответить
    • Можно еще как геттер использовать:
      const int (&getArray() const)[10] {
          return array_;
      }
      Ответить
    • После таких кодов хочется согласиться с отношением TarasB к плюсам.
      Ответить
      • Это просто синтетический пример. Изврат ради изврата. В реальной жизни я такого еще не встречал.
        Ответить
        • И если понадобится то следует написать
          typedef int (&TEN_INT_ARRAY_REF)[10];
          Ответить
          • >> typedef int (&TEN_INT_ARRAY_REF)[10];
            Вот только
            static int tmp[10] = {1,2,3,4,5,6,7,8,9,10};
            поменяют кол-во констант в массиве, так и придется править константу кол-ва элементов массива и перекомпилировать все модули.
            Ответить
            • факт =)
              Ответить
            • Продолжаем извращаться! А теперь - с шаблонами!!!
              #include <stdio.h>
              
              const int (&getArray())[10] {
                static int tmp[] = {1,2,3,4,5,6,7,8,9,10};
                return tmp;
              }
              
              template< size_t N >
              void foo(const int (&refArr)[N]) {
                size_t size = sizeof(refArr); // returns 10*sizeof(int)
                std::cout << "Array size (bytes): " << size << std::endl;
              }
              
              template< typename T, size_t N >
              size_t ArraySize( T (&)[ N ] ) {
                  return N;
              }
              
              int main() {
                foo(getArray());
              
                std::cout << "Array size (elements): " << ArraySize(getArray()) << std::endl;
              
                const int (&refArr)[10] = getArray();
                std::cout << refArr[0];
                for (size_t i=1; i<sizeof(refArr)/sizeof(refArr[0]); ++i)
                  std::cout << "," << refArr[i];
                  
                return 0;
              }
              Ответить
      • Это вобще какой-то аппендицит плюсовый...
        Ответить
    • /r TarasB ИТТ для срача на 100+ камментов.
      Ответить
    • ЛОЛ, открываю говнокод, а хром говорит типа: это страница на английском, перевести ли её?
      А если нажать "перевести", то ваще умора, 1С отдыхает!

      (типа это я отписался тут)
      Ответить
      • Пассивный Тарас
        Ответить
      • вебкит - говно, если чо
        Ответить
      • Пишу с links - это волшебно!
        Ответить
        • С Links не залогинится (как и с W3M), JavaScript нужен... или я даж не знаю почему...
          Ответить
        • О! Получилось :) Хехе, но еще недели две назад не работало :)
          Ответить
      • помнится, я тоже прифигел от хрома и тоже на говнокоде, и тоже отписался в комментах на этот счет.
        Ответить
    • Другое дело, что адекватные люди такие извращённые конструкции редко используют, и нормальный С++ читать не менее приятно, чем С#.

      Всё зависит от количества говна в голове человека, от его синдрома кулхацкера.
      Ответить
    • Учись студент, программистом будешь!
      Ответить
    • На самом деле оно очень даже читаемо. Не привычно просто. Да и нужды так писать нет, когда можно лучше.
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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