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

    +28

    1. 1
    2. 2
    std::size_t _;
    std:size_t __;

    http://ideone.com/Ie1AY

    Запостил: HaskellGovno, 13 Сентября 2012

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

    • Говно уже добралось до GCC. Оно уже сжирает его изнутри. Соответствие стандарту налицо.
      Ответить
      • точняк
        http://ideone.com/HcoWo
        Ответить
        • Весело. А одинарное двоеточие - это фишка гцц?
          Ответить
          • нет, это теперь во всех компиляторах работает
            Ответить
            • 0x? На ideone и в обычном c++ кушает
              Ответить
              • моя ссылка ни на какие мысли не навела?
                Ответить
                • Навела. Не понял почему size_t доступен как из глобального пространства имен, так и из std.
                  Ответить
                  • обычное дело, когда нечто из C standard library (в данном случае typedef из stddef.h) кочует в C++, доопределяясь внутри в namespace std (cstddef) через using
                    при желании можно std::memcpy или std::printf писать - это разве не так же смущает?
                    Ответить
          • > Весело. А одинарное двоеточие - это фишка гцц?
            Вот до чего доводит ООП и структурное программирование!
            Ответить
          • Это метка. Для goto. Всегда ваш :)
            Ответить
    • О, крестоблядский крестоязык начал бороться с крестоблядскими нагромождениями из четырёх крестоточек, разрешив использовать только две крестоточки? Прогресс!
      Ответить
      • ты его раскусил
        Ответить
      • В жабе, кстати, точек надо вчетверо меньше чем в крестах.
        Ответить
        • А в LINQ точки без запятых.

          Кстати в жабе тоже можно:
          http://ideone.com/ocdGh
          Бля. Подсветка синтаксиса всё испортила.
          Ответить
          • А в хаскеле пробелы вместо точек.
            Ответить
            • И проблемы вместо скобок
              Ответить
            • и полиморфные точки с запятой
              Ответить
              • Пожалуй, поясню мысль простым примером:
                go :: Monad m => m Int -> m Int
                go m = do { x <- m; y <- m; return (x + y) }
                Поскольку это преобразуется в код с bind (>>=) конкретный смысл ; зависит от реализации bind, так точка с запятой получается полиморфной
                Ответить
                • Я ждал этого! Зачёт.
                  Ответить
                • #define ; >>

                  Дальше перегружаем оператор >>

                  PS: Цвет планировался зелёным, но краска закончилась.
                  Ответить
                  • но маляр Шмелиэль ещё не принёс ведро с краской
                    Ответить
          • Джава может в литералы URI
            Ответить
    • When you see it, you'll shit bricks.
      Ответить
    • ребята, пора ставить крест на этих крестах
      Ответить
    • О боже, МЕТКА!
      Ответить
    • Объясните человеку, далёкому от крестопроблем: говно в том, что в новом стандарте разделили пространства символов меток и нэймспейсов?
      Ответить
      • Никто ничего не разделял. Двойное двоеточие - пространство имен, одинарное - метка. В исходном гк подъеб в том, что size_t доступен как в глобальном пространстве имен, так и в std.
        Ответить
        • да с меткой я сразу понял. Доступность size_t из глобального пространства имён - глюк какого-то компилятора, попавший в стандарт?
          Ответить
          • Это для обратной совместимости
            Ответить
            • Да это я тоже сразу понял. Я не понял, что в этом такого.
              Т.е. Суть в том, что можно опечататься в одном двоеточии, и получишь метку вместо нэймспейса, и компилятор не поможет?

              Запрет объявлять метки, идентификатор которых совпадает с идентификатором нэймспейса, решает проблему?
              Ответить
              • разве есть какая то проблема?
                я и переменную могу объявить с именем, совпадающим с неймспейсом

                компилятор в большинстве случаев поможет:
                1) warning: label 'std' defined but not used [-Wunused-label]
                2) джважды в одном scope эту метку не объявишь
                3) using namespace std; делает только школота на лабах, поэтому вероятность совпадения имени типа в конкретном месте приложения (например, std::string vs свой неверный тип string) достаточно низка, хоть и не нулевая, и даже если вдруг так случилось - чтобы не было намекающих ошибок компиляции, использование ложного типа должно в точности повторить настоящий

                а так можно параноидально писать везде не std::string, а ::std::string - уверен, Тарасу понравится, когда листинг будет напоминать перфокарту
                Ответить
                • > ::std::string
                  It's beautiful! Теперь буду писать именно так.
                  ::std::vector<::std::string> items;
                  for (::std::vector<::std::string>::iterator i = items.begin(), end = items.end(); i != end; i++) {
                      ::std::cout << *i << ::std::endl;
                  }
                  Ответить
                • > разве есть какая то проблема?
                  Дык, в том и дело, что я тоже большой проблемы не увидел. Решил спросить на всякий случай, уж больно плюсов у поста много.
                  Ответить
                  • Любой код на c++ имеет на джва плюса больше, чем любой другой код.
                    P.S. Если это не код на шарпах.
                    Ответить
                • >3) using namespace std; делает только школота на лабах, поэтому вероятность совпадения имени типа в конкретном месте приложения (например, std::string vs свой неверный тип string) достаточно низка

                  А ты думаешь дело в using ?
                  Нет никакого using, а проблема не ушла:
                  http://ideone.com/VWIvn
                  Ответить
                  • Проблема с using будет проявляется, когда есть два класса с одним и тем же именем: один в нэймспейсе, а другой в импортирован в глобальный нэймспейс директивой using. В таком случае можно случайно перепутать классы, если забыть двоеточие:
                    #include <vanilla>
                    using namespace std;
                    // ... later
                    vanilla::list ls; // Ok.
                    vanilla:list lst; // Ouch, got std::list
                    Ответить

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