metaclass: (Default)
[personal profile] metaclass
Это, а как в C принято обрабатывать ошибки?
Т.е. обычная программа: я открываю всякие ком-порты, сокеты и файлы, что-то с ними пытаюсь делать, затем закрываю. В дельфи/java/C#/Clojure это всегда делается через обработку исключений в виде try-finally/using или чего-то аналогичного, в C++ - RAII, а вот что делать в С? Аналогично, с выводом сообщений об ошибке - try{..}catch(Exception e) {logger.Fatal(e};raise}

Я каждую вызываемую функцию проверяю на адекватность возвращаемого результата и при ошибке вывожу в stderr сообщение и strerror(errno), причем выглядит это достаточно единообразно, чтобы хотелось автоматизировать, но принято ли делать хитрожопые макросы типа CHECKERROR(some_call(),"some_call failed") и из них вываливаться из программы при ошибках?

А, и это - принято ли в C заниматься конкатенацией строк по поводу и без повода? А то, скажем, я привык в простых программах особо не мудрить и при необходимости складывать строки, если нет явных требований к производительности. Например, какая-нибудь дурь типа генерации строковых команд из шаблонов и параметров - тупо поскладывал строки и вернул результат. А в С придется strcat использовать, буфера какие-то объявлять, память выделять, трястись за ее удаление или же писать результат прямо в выходной файл, что вообще tight coupling.

Date: 2012-04-21 06:40 pm (UTC)
From: [identity profile] denisioru.livejournal.com
Ну сделай макрос CHECKERROR(some_call(),"some_call failed",finalizer)

где finalizer - функция, подчищающая говно за some_call

Date: 2012-04-21 06:45 pm (UTC)
From: [identity profile] metaclass.livejournal.com
финализеру нужно подчищать все, что успешно отработало ДО него.

(no subject)

From: [identity profile] nicka-startcev.livejournal.com - Date: 2012-04-21 07:03 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 07:12 pm (UTC) - Expand

Date: 2012-04-21 07:07 pm (UTC)
From: [identity profile] w00dy.livejournal.com
Тю, делай код в стиле:
CHECK (AllocateResource1, Fin0) ;
CHECK (AllocateResource2, Fin1) ;
CHECK (AllocateResource3, Fin2) ;

use resources

FreeResource3 ;
Fin2:
FreeResource2 ;
Fin1:
FreeResource1 ;
Fin0:


и макрос
CHECK (func, label) \
if (!func ())
goto label ;
Edited Date: 2012-04-21 07:09 pm (UTC)

Date: 2012-04-21 07:43 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
Да там народ издевается, как может.
Видел и такое:
int stage = 0;
if (func1() < 0)
  goto done;
stage = 1;
if (func2() < 0)
  goto done;
stage = 2;
if (func3() < 0)
  goto done;
done:
switch(stage)
{
  case 2:
    free_res2();
  case 1:
    free_res1();
  default:
    break;
}

Кстати, что забавно - встречено в MSDN :)

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 07:46 pm (UTC) - Expand
(deleted comment)

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 08:21 pm (UTC) - Expand
(deleted comment)

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 08:39 pm (UTC) - Expand
(deleted comment)
(deleted comment)

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 09:45 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 09:33 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 08:35 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 08:40 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 08:46 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 08:48 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 08:49 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 08:51 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 08:52 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 08:57 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:00 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:01 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:09 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:11 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:13 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:18 pm (UTC) - Expand

(no subject)

From: [identity profile] dair-spb.livejournal.com - Date: 2012-04-22 08:55 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-22 09:08 am (UTC) - Expand

(no subject)

From: [identity profile] max630.livejournal.com - Date: 2012-04-22 04:14 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 09:02 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:05 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:06 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:09 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 09:18 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:19 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2012-04-22 05:31 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 09:07 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:10 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 09:17 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:35 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 08:54 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 08:55 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 09:00 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:02 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 09:06 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 09:01 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:04 pm (UTC) - Expand

(no subject)

From: [identity profile] berezovsky.livejournal.com - Date: 2012-04-21 09:06 pm (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-21 09:08 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 08:05 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 08:11 pm (UTC) - Expand

(no subject)

From: [identity profile] blackyblack.livejournal.com - Date: 2012-04-21 08:39 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 08:45 pm (UTC) - Expand

(no subject)

From: [identity profile] blackyblack.livejournal.com - Date: 2012-04-22 06:35 am (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 08:45 pm (UTC) - Expand

(no subject)

From: [identity profile] vp.livejournal.com - Date: 2012-04-21 08:48 pm (UTC) - Expand

(no subject)

From: [identity profile] fkng-stupid-lj.livejournal.com - Date: 2012-04-22 11:37 am (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-22 12:33 pm (UTC) - Expand

(no subject)

From: [identity profile] fkng-stupid-lj.livejournal.com - Date: 2012-04-22 02:22 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-22 02:23 pm (UTC) - Expand

Date: 2012-04-21 07:11 pm (UTC)
From: [identity profile] mehanizator.livejournal.com
sprintf не решит проблему конкатенации?

Date: 2012-04-21 07:28 pm (UTC)
From: [identity profile] metaclass.livejournal.com
snprintf наверно да. Если знать, что размеры результатирующей строки не вылезут за пределы буфера.

(no subject)

From: [identity profile] swizard.livejournal.com - Date: 2012-04-21 08:21 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 08:30 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 08:31 pm (UTC) - Expand

(no subject)

From: [identity profile] swizard.livejournal.com - Date: 2012-04-21 08:36 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 08:46 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 07:38 pm (UTC) - Expand

(no subject)

From: [identity profile] blackyblack.livejournal.com - Date: 2012-04-21 08:35 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 08:41 pm (UTC) - Expand

Date: 2012-04-21 07:39 pm (UTC)
From: [identity profile] familom.livejournal.com
Возврат ресурсов при обработке — через метки и goto. Например, goto failed_config_opening, goto success и т.п.

Date: 2012-04-21 07:55 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
Кстати, незаслуженно забыты setjmp/longjmp.
В частности, разработчики libjpeg укурились настолько, что у них не предусмотрен возврат в программу после возникновения ошибки открытия файла (ну а что, не тот формат и бабац). GIF'ов с расширением .jpg на просторах инета хватает.
Пришлось откровенно издеваться.

Date: 2012-04-21 07:59 pm (UTC)
From: [identity profile] justy-tylor.livejournal.com
Да, хитрожопые макросы с множеством goto.

Особенно забавно это делать на телефонах, когда в любой момент может кончиться память. И тогда надо последовательно освобождать все ресурсы графической подсистемы на данный кадр, а затем кидать в JVM эксепшн "сотонинская жаба, убери мусор".

Date: 2012-04-21 08:27 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
Кстати, ребе, открою страшную тайну. Я обычно НЕ проверяю успешность отработки malloc при размере выделяемой памяти грубо менее килобайта.
Понятно, что не есть это хороший тон, но это специфика работы. В частности, в нашем XML-языке при невозможности что-то сделать на выходе команды генерируется узел с текстом ошибки, но - опять же в "куче". Не хватило место под первый malloc() - так не хватит и на цепочку последующих. И если системе килобайта жалко, то она поставлена не то что на колени, а раком, и даже на логгер особо рассчитывать не приходится. Как бы ни было обидно.

Date: 2012-04-21 08:32 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Строки под ошибки рекомендуют выделять заранее:)

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 08:43 pm (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-21 08:49 pm (UTC) - Expand

(no subject)

From: [identity profile] justy-tylor.livejournal.com - Date: 2012-04-21 09:05 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 09:07 pm (UTC) - Expand

(no subject)

From: [identity profile] justy-tylor.livejournal.com - Date: 2012-04-21 09:22 pm (UTC) - Expand

(no subject)

From: [identity profile] sbj-ss.livejournal.com - Date: 2012-04-21 09:36 pm (UTC) - Expand

Date: 2012-04-21 08:27 pm (UTC)
From: [identity profile] swizard.livejournal.com
В принципе, относительно малой кровью в сях можно эмулировать RAII через псевдо-замыкания и обёртки а-ля схема "call-with-open-file", "call-with-db-query", etc.

Другое дело, что процесс это достаточно унылый: в силу бедности языка приходится писать много лишнего кода, и контекст восприятия рвется. Но ничего, для сельской местности сойдёт, по мне всяко лучше, чем goto cleanup :)

Date: 2012-04-21 08:27 pm (UTC)
From: [identity profile] theiced.livejournal.com
маккрос-проверяльщик и goto finally ;]

Date: 2012-04-21 08:31 pm (UTC)
From: [identity profile] blackyblack.livejournal.com
"принято ли делать хитрожопые макросы типа CHECKERROR(some_call(),"some_call failed") и из них вываливаться из программы при ошибках?"

В особо умных исходниках принято. Такой макрос называется ASSERT :)
Но вообще, в сях мудрить не стоит - чем проще, тем лучше. Поэтому, как правило, тупо проверяется каждое возвращаемое значение каждой функции.

"А, и это - принято ли в C заниматься конкатенацией строк по поводу и без повода? А то, скажем, я привык в простых программах особо не мудрить и при необходимости складывать строки, если нет явных требований к производительности. Например, какая-нибудь дурь типа генерации строковых команд из шаблонов и параметров - тупо поскладывал строки и вернул результат. А в С придется strcat использовать, буфера какие-то объявлять, память выделять, трястись за ее удаление или же писать результат прямо в выходной файл, что вообще tight coupling."

Принято, если нет явных требований к производительности :) А вот память выделять без явной необходимости не стоит. Все буфера выделяются статически или в стеке, соответственно и освобождать ничё не требуется. Размер выделяемого буфера, естественно, выбирается эмпирически. А что вы хотели, low level programming.

Date: 2012-04-21 08:41 pm (UTC)
From: [identity profile] metaclass.livejournal.com
>Все буфера выделяются статически или в стеке
Если проверять при этом размеры, то наверно, ничего страшного. Надо себе сломать мозг и делать универсально только там где это действительно нужно, типа "а тут нашей проге через stdin дадут 2гб строку из 20 гб файла"

Date: 2012-04-21 08:39 pm (UTC)
From: [identity profile] permea-kra.livejournal.com
>А, и это - принято ли в C заниматься конкатенацией строк по поводу и без повода?
Емнип, там трясуться за производительность, поэтому в линупсах даже придумали writev. Вот куда он потом дополз - вопрос более интересный.

Date: 2012-04-21 08:44 pm (UTC)
From: [identity profile] metaclass.livejournal.com
scatter-gather. какой гамон.

(no subject)

From: [identity profile] permea-kra.livejournal.com - Date: 2012-04-22 04:50 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2012-04-22 07:10 am (UTC) - Expand

Date: 2012-04-21 08:55 pm (UTC)
From: [identity profile] plumqqz.livejournal.com
В дельфи/java/C#/Clojure это всегда делается через обработку исключений в виде try-finally/using или чего-то аналогичного, в C++ - RAII, а вот что делать в С?

Ну и тут делайте. setjmp/longjmp

Date: 2012-04-22 01:18 am (UTC)
From: [identity profile] esil0x.livejournal.com
setjmp/longjmp уже давно нигде не используется для исключений.

(no subject)

From: [identity profile] plumqqz.livejournal.com - Date: 2012-04-22 07:29 pm (UTC) - Expand

Date: 2012-04-21 08:57 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
внезапно си

Date: 2012-04-21 09:39 pm (UTC)
From: [identity profile] astoon.livejournal.com
Спасибо что живой.

(no subject)

From: [identity profile] berezovsky.livejournal.com - Date: 2012-04-21 09:41 pm (UTC) - Expand

(no subject)

From: [identity profile] blueher.livejournal.com - Date: 2012-04-22 08:49 pm (UTC) - Expand

Date: 2012-04-21 09:36 pm (UTC)
From: [identity profile] kong-en-ge.livejournal.com
сколько интересных способов залезть на шкаф...

Date: 2012-04-22 07:04 am (UTC)
From: [identity profile] metaclass.livejournal.com
Ребе, я теперь окончательно понял, почему ситиинфы под линукс не бывает :)

(no subject)

From: [identity profile] kong-en-ge.livejournal.com - Date: 2012-04-25 11:18 am (UTC) - Expand

Date: 2012-04-21 10:24 pm (UTC)
From: [identity profile] http://users.livejournal.com/mak_/
сто лет уже не программировал:) assert не поможет?

Date: 2012-04-21 10:40 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
Религия не позволяет считать это чем-то бОльшим, чем средство отладки :)
Да и вывести "can't lock file "c:\beetles and frogs.txt", function CrazyClownFunction" assert не даст. А вот юзеры конечной программы вылетающее окошко "Assertion failed, program matzo.exe line 1488" дико ненавидят.

Date: 2012-04-21 11:52 pm (UTC)
From: [identity profile] qehgt.livejournal.com
Мы когда-то делали так:
http://habrahabr.ru/post/141507/

Date: 2012-04-22 01:24 am (UTC)
From: [identity profile] theiced.livejournal.com
это же ссылка на хабр!!112

Date: 2012-04-22 12:52 am (UTC)
From: [identity profile] baramin.livejournal.com
В нашем проекте я законодательно запретил С. Ибо, если если есть С, есть и С++. Иначе - нефиг.
Ну, если лезть обратно на пальму, то
1]
status = 0;
while (1) {
if ( fail(status = f1()) )
break;
if ( fail(status = f2()) )
break;
status = f3();
break;
}
//зачищаем всех, кто не NULL

2] лестница (MS COM approach)
var lhv1;
status = create1(&lhv1);
if (fail(status)) {
print_error(status);
} else {
//хитрость в том, что dispose пишется сразу.
//статус заверщения - глобален! Привет HRESULT
//здесь в том же формате пишем второй шаг (рекурсия:) ):
var lhv2;
status = create2(&lhv2);
if (fail(status)) {
print_error(status);
} else {
//next step is here
dispose(lhv2)
}

dispose(lhv1)
}
return status.

Date: 2012-04-22 07:07 am (UTC)
From: [identity profile] metaclass.livejournal.com
Торвальдс воспрещает С++ :)
Впрочем, у меня как раз наверно и на С++ можно было бы все сделать и было бы проще.

(no subject)

From: [identity profile] justy-tylor.livejournal.com - Date: 2012-04-22 08:47 am (UTC) - Expand

(no subject)

From: [identity profile] esil0x.livejournal.com - Date: 2012-04-22 09:14 am (UTC) - Expand

(no subject)

From: [identity profile] justy-tylor.livejournal.com - Date: 2012-04-22 09:40 am (UTC) - Expand

(no subject)

From: [identity profile] esil0x.livejournal.com - Date: 2012-04-22 09:42 am (UTC) - Expand

(no subject)

From: [identity profile] justy-tylor.livejournal.com - Date: 2012-04-22 09:55 am (UTC) - Expand

(no subject)

From: [identity profile] esil0x.livejournal.com - Date: 2012-04-22 09:59 am (UTC) - Expand

(no subject)

From: [identity profile] justy-tylor.livejournal.com - Date: 2012-04-22 10:21 am (UTC) - Expand

(no subject)

From: [identity profile] esil0x.livejournal.com - Date: 2012-04-22 10:23 am (UTC) - Expand

(no subject)

From: [identity profile] blackyblack.livejournal.com - Date: 2012-04-22 10:13 am (UTC) - Expand

Date: 2012-04-22 01:20 am (UTC)
From: [identity profile] esil0x.livejournal.com
Есть один правоверный способ грамотной обработки ошибок в программах на С, применение которого возможно в 99% случаев. Последовательность действий следующая:

1) Переименовать исходники в *.cpp
2) use raii
3) PROFIT!!!

С конкатенацией строк, говорят, тоже помогает.

Date: 2012-04-22 01:25 am (UTC)
From: [identity profile] theiced.livejournal.com
это проверенный способ сделать вместо программы кусок говна.

(no subject)

From: [identity profile] esil0x.livejournal.com - Date: 2012-04-22 01:30 am (UTC) - Expand

(no subject)

From: [identity profile] theiced.livejournal.com - Date: 2012-04-22 11:22 am (UTC) - Expand

(no subject)

From: [identity profile] esil0x.livejournal.com - Date: 2012-04-22 11:37 am (UTC) - Expand

Date: 2012-04-22 01:50 am (UTC)
From: [identity profile] esil0x.livejournal.com
А, да, тут не упомянули ещё один вариант:

resource1 = alloc_resource1();
if (resource1) {
resource2 = alloc_resource2();
if (resource2) {

// use resource1 & resource2

free_resource2(resource2);
} else
log("alloc_resource2 failed");

free_resource1(resource1);
} else
log("alloc_resource1 failed");


Единственный большой недостаток - с увеличением количества ресурсов растёт вложенность. Иногда помогает разбиение на более мелкие функции.
Но лучше перестать грызть себе нокти и делать так, как я написал в предыдущем комменте.

Date: 2012-04-22 07:10 am (UTC)
From: [identity profile] sleepy-drago.livejournal.com
зависит от степени лени девелопера.
долбо^W можно пользоваться макросом который прыгает за return success где в конце функции в обратном порядке написаны освобождалки ресурсов в нужное место.
Можно иметь и список функций очистки на функцию и вызывать их в обратном порядке. Можно иметь класс (тссс!) строки и конкатенатор к нему. И память выделяемую регионами так чтобы ни одного free в коде не было.
Посмотрите на код тех для кого вы пишете и делайте так же как они - иначе они не примут контрибуции :) Я ж не верю что это себе :D

Date: 2012-04-22 07:11 am (UTC)
From: [identity profile] metaclass.livejournal.com
Себе, себе пишу. Для кого-то я не настолько хорошо С умею.

(no subject)

From: [identity profile] sleepy-drago.livejournal.com - Date: 2012-04-22 07:20 am (UTC) - Expand

Date: 2012-04-22 09:03 am (UTC)
From: [identity profile] dair-spb.livejournal.com
Я, в результате подобных же мозговых нестыковок, дошёл до такого:

 b r

     res  allocSomething2
     res  
    
        
        cres
        releaseSomething2
    


 a

     res  allocSomething1
     res  
    
        
        bres
        releaseSomething1
    

Edited Date: 2012-04-22 09:03 am (UTC)

Date: 2012-04-22 09:08 am (UTC)
From: [identity profile] berezovsky.livejournal.com
ээээ, как разукрашечку сделать?

(no subject)

From: [identity profile] dair-spb.livejournal.com - Date: 2012-04-22 09:48 am (UTC) - Expand

Date: 2012-04-22 11:29 am (UTC)
From: [identity profile] fkng-stupid-lj.livejournal.com
foo_t* 
foo(void)
{
    bar_t *bar;
    baz_t *baz;
    foo_t *foo;

    bar = bar_new();
    if (!bar)
      goto e0;
    baz = baz_new();
    if (!baz)
      goto e1;
    foo = foo_new(bar, baz);
    if (!foo)
      goto e2;
    return foo;

e2: baz_free(baz);
e1: bar_free(bar);
e0: return NULL;
}


Дешево и сердито. Плюс вариации. Можно, конечно, и exceptions замутить (типа таких (http://www.on-time.com/ddj0011.htm)), но в сборном проекте они не особенно полезны, вот если монолитная система, тогда может быть.

Насчет строк -- или, как сказали, aprintf, если есть, или поискать какую-нибудь более развесистую библиотеку.

Date: 2012-04-22 02:39 pm (UTC)
From: [identity profile] fillest.livejournal.com
по поводу строк - http://bstring.sourceforge.net/

Date: 2012-04-22 05:07 pm (UTC)
From: [identity profile] chemodax.livejournal.com
Для многих вещей C лучше чем C++, просто его нужно уметь готовить. APR с пулами, и что-нить типа svn_error_t для возврата ошибок.

Date: 2012-04-22 07:53 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
почитал каментики. бля.

ресурсы освобождать очень просто:

return OK;
fail:
if(res1) free_res(res1);
и так по каждому;
return FAIL;
}

Date: 2012-04-22 08:11 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Так и сделал в итоге.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 16th, 2025 05:19 am
Powered by Dreamwidth Studios