Няшная / Говнокод #27227 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
char* to_str(int i) {
    char* s = malloc(12);
    sprintf(s, "%d", i);
    return s;
}

Как в сишке без RAII принято жить? Пиздец какой-то. Буфер в функцию передавать?

Что мешает завезти RAII в сишку?

Запостил: 3_dar 3_dar, (Updated )

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

  • или буфер, или размер


    RAII сразу требует охулиард всего, так как копирование данных уже больше не копирование, а вызов какого-то кода. А это перехучка половины языка
    Ответить
    • зы: если размер, то конечно на клиентской стороне чистить вилкой
      Ответить
      • Зачем размер? free() не подойдёт?
        Ответить
        • Ну если ты хочешь, чтобы вызываемая сторона работала с кучей, то у тебя есть выбор:

          * передать ей размер, и попросить создать
          * создать самому

          Кстати, в твоем случае можно наверное выделить размер на стеке. Максимальный размер строки INT_MAX в общем понятен заранее, не?
          Ответить
          • Размер определяет функция. Вызывающей стороне достаточно вызвать free.
            Ответить
          • Куча не нужна.

            Можно иметь один статический буфер, содержимое в нём хранится до следующего вызова этой функции. Если его нужно сохранить, сам его копируешь куда-нибудь.
            Ответить
              • Потоки тоже нинужны.

                Но можно просто иметь по буферу на поток.
                Ответить
                • то есть ты предлагаешь знание о библиотеке потоков и о thread local storage утромбовать в эту функцию?
                  а если потоки создаются, прости господи, динамически?
                  Ответить
                  • Можно выделять буфер при создании потока. Или при каждом вызове этой функции проверять, создан ли для этого потока буфер, и если нет, создать его.
                    Ответить
  • для облегчения жизни память должны выделить внешняя функция и передать указатель буфера в функцию.
    Ответить
      • размер должны выдать функция куда пихать буфер если указать NULL как буфер
        Ответить
      • Не вижу ничего особо говнистого. Уныло конечно писать некоторое количество бойлерплейта, но он довольно легкий. Сишники обычно принихиваются со временем, и им не пахнет
        Ответить
        • В моем примере длину может определять функция. Могу сделать оптимизацию, что если число < 10000, то выделять 7 байт, иначе 11. Теперь это клиент должен делать, или передавать с запасом?
          Ответить
          • Делай как больше нравится, главное задокументируй. Наверное, проще всё таки попросить клиента за тобой почистить
            Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8