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

    +125

    1. 1
    2. 2
    3. 3
    4. 4
    void get_me(const char **retval)
    {
        *retval = "Hello, Word!";
    }

    Надейся на компилятор...

    Запостил: Novi4oK, 16 Февраля 2013

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

    • > Надейся на компилятор...
      Ну и кто додумался это плюсануть? Еще один не знающий сишку? Идите почитайте уже какую-нибудь книгу по си, и тогда поймете почему так, и куда надо писать конст, чтобы было не так:
      char ** const a;
      a = &s; // error
      *a = s; // ok
      **a = 'a'; // ok
      
      char * const * a;
      a = &s; // ok
      *a = s; // error
      **a = 'a'; // ok
      
      char const ** a; // и аналогичный ему const char ** a;
      a = &s; // ok
      *a = s; // ok
      **a = 'a'; // error
      Ответить
      • И не забываем правило http://bit.ly/5YSSb9
        Ответить
        • Я попробую: "retval is a pointer to pointer to a char constant". Посоны, походу работает!
          Ответить
          • Проще так: передаём по ссылке строку из неизменяемых символов.
            Ответить
            • в сях нет сцылок
              Ответить
              • Я про семантику.
                Ответить
                • Ну это как назвать функцию init() конструктором.
                  Ответить
                  • В контексте данного разговора ваше замечание про ссылку - бессмысленное буквоёбство.
                    Ответить
                    • Если фраза понятна, это ещё не значит, что она правильна. А правила задает стандарт.
                      Ответить
                  • Ну если она семантически играет роль конструктора, а мы пишем на си, в стандартах которого нет понятия о конструктора, а следовательно и конфликта - почему нет?
                    Ответить
                    • Таким тарасом макаром мы и исключения в си "добавим", и шаблоны. И черти что, чего там никогда не было и не будет.
                      Ответить
                      • > шаблоны
                        так уже ведь
                        Ответить
                        • щито? на дефайнах что ли?
                          Ответить
                          • http://www.robertgamble.net/2012/01/c11-generic-selections.html
                            Сишка тоже не стоит на месте
                            Ответить
                            • Получи cacos для double complex :)
                              Единственная прикольная фишка - это printf_dec_format. Но всё равно обосрались со строками и cv-типами.
                              Но если для cv можно расширить, то строки в любом случае приводить к (char*), если я правильно понял.
                              Короче говоря, получается некая специлизация для выбранных типов. А тела однотипных функций для разных типов (какая замысловатая фраза получилась) всё равно придется дуплить.
                              Ответить
                              • как по мне, так _Generic - полное убожество
                                учитывая, что на дворе 2013 год
                                больше всего в многострочных макросах (а тут на пару десяток строк постоянно будет выходить) будут вымораживать слеши на концах строк

                                не говоря уж о том, что подсветка синтаксиса внутри будет, мягко говоря, странной
                                Ответить
                                • >на дворе 2013 год
                                  по буддийскому календарю и вовсе 2556
                                  >подсветка синтаксиса внутри будет, мягко говоря, странной
                                  это уже проблемы тех, кто фонарик держит
                                  >полное убожество
                                  полностью согласен
                                  Ответить
                                • > _Generic - полное убожество
                                  После знакомства с плюсовыми шаблонами с этим сложно не согласиться. Закат солнца вручную. Степанов рыдает кровавыми слезами.
                                  Ответить
                                  • >> _Generic - полное убожество
                                    Ну это примерно как реализовывать препроцессором в крестах хацкильные фичи.
                                    Сраная сишка катится в сраное говно.
                                    Ответить
                                    • Она туда сорок лет катится, только вот пока ничего более жизнеспособного пока не придумали.
                                      Ответить
                                      • >ничего более жизнеспособного пока не придумали
                                        Нечто таки придумали. Этим нечто, к сожалению, оказались кресты.
                                        Ответить
                                        • Если обратиться к "Design and Evolution of C++", можно понять, что это были лихие восьмидесятые, и Страуструп крутился как мог.
                                          Необходимость максимальной совместимости с сишкой сильно попортила всем кровь (особенно товарищу Бьёрну), но зато помогла языку подняться. Плюсы бы просто не взлетели без этой совместимости.
                                          Закись нескольких языков и парадигм в одном даёт широкий простор для проектирования, но, к сожалению, частенько выносит мозг, а также накладывают определённые рамки на уровень программистов, способных писать вменяемый код.
                                          В любом случае, обвинять кого-то в этом у меня нет повода.
                                          Ответить
                                          • >Плюсы бы просто не взлетели без этой совместимости.
                                            Согласен
                                            Тут уместна цитата создателя ирланга:
                                            I saw C++ coming and read the book - or at least tried to read the book - there's a dent in the wall behind my piano, where the book hit the wall - Improvements to C should make things
                                            easier not more complicated, I thought.

                                            http://erlang.org/pipermail/erlang-questions/attachments/20130124/0d4405fc/attachment.html
                                            Ответить
                                            • > there's a dent in the wall behind my piano, where the book hit the wall
                                              Я тоже посмеялся. В теории никто не запрещает использовать процедурное сишное подмножество c++, которое в некотором смысле easer. Но пара прикрученных по бокам парадигм делает c++ в целом несравненно более сложным, чем сплав пролога со smalltalk.
                                              Ответить
                                              • >В теории никто не запрещает использовать процедурное сишное подмножество c++, которое в некотором смысле easer

                                                Думаю я б так и писал на крестах. Собственно пытаюсь сохранять структурно-процедурные традиции и в жабе. Исключения, женерики и GC сильно облегчают работу по сравнению с сишкой.
                                                Проблема в том что рано или поздно сталкиваешься с чужим кодом и его поддержкой.
                                                Ответить
                                                • вот не надо нам в с++ людей, которые будут чтить традиции, игнорируя автоуправление ресурсами, шаблоны и перегрузку функций

                                                  впрочем, тебе стоит только начать, и презираемые кресты из гадкого утёнка легко могут преобразиться в нечто более приятное
                                                  и да, у нас есть печеньки
                                                  Ответить
                                                  • Кстати, а правда, что кресты не могут в перегрузку

                                                    int(int)
                                                    float(void)
                                                    ?
                                                    Ответить
                                                    • > что кресты не могут в перегрузку
                                                      Поясните мысль
                                                      http://ideone.com/KVY5rR
                                                      Ответить
                                                      • там есть в с++ ограничение о том, что одноименные функции не имеют права иметь одинаковый список аргументов (и константность, если это методы), но различаться типом результата
                                                        но это не очень то, что написал тарас
                                                        Ответить
                                                      • А у меня в ГЦЦ не захотело собираться Т_Т
                                                        Ответить
                                                        • g++ 4.6.3
                                                          clang++ 3.0 (tags/RELEASE_30/final)
                                                          С флагами -pedantic -Wall собирают без проблем.
                                                          Ответить
      • тут дело не в разрешимости такого присваивания, а в том, что константная строка будет доступна вне функции. Если придерживаться того, что все объекты, созданные внутри функции, уничтожаются при выходе из неё, может создаться впечатление того, что эта константная строка тоже будет удалена, но дело в том, что компилятор все константы сохраняет отдельно, поэтому при выходе из функции строка будет существовать. Но никто не заставляет компилятор так себя вести, отсюда и загаловок)
        Ответить
        • > объекты, созданные внутри функции, уничтожаются при выходе из неё
          Это Спарта Си, тут солнце выкатывают и закатывают вручную, и автоматом освобождается разве что память, выделенная malloca.

          > может создаться впечатление
          > Но никто не заставляет компилятор так себя вести
          Читаем стандарт. На 3 раза. Чтобы впечатлений не создавалось.

          Процитирую крестовый, но в сишном должно быть аналогично:
          2.13.4 String literals
          An ordinary string literal has type “array of n const char” and static storage duration, where n is the size of the string as defined below, and is initialized with the given characters.
          A wide string literal has type “array of n const wchar_t” and has static storage duration, where n is the size of the string as defined below, and is initialized with the given characters.

          3.7.1 Static storage duration
          All objects which neither have dynamic storage duration nor are local have static storage duration. The storage for these objects shall last for the duration of the program
          Ответить
        • > Но никто не заставляет компилятор так себя вести

          Стандарт заставляет.
          Ответить
          • И здравый смысл. Компилятор никак не догадается как долго я буду юзать каждый из литералов. А освободить руками возможности нет. Поэтому никуда они не денутся, даже если не читать стандарт, процитированный мной выше ;)
            Ответить
        • Путаешь с "char buf[123];"
          Ответить
    • > Надейся на компилятор...
      Код корректен, не понимаю проблемы.
      Ответить
      • Проблема видимо в том, что ОП не дочитал главу о const до конца.
        Ответить
    • Перед собой я вижу Питуха своего.
      Я вижу Курочку свою.
      Я вижу братьев и сестер своих.
      Вижу весь Род свой до последнего колена.
      Они зовут меня
      Занять мое место среди них
      В залах Говнокода, месте,
      Где сильные духом будут жить вечно.
      Ответить

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