Здравствуйте, kov_serg, Вы писали:
_>Почему слабо — изображу например так:
_>_>// m.h
_>int m_init(void** h);
_>int m_fn(void *h);
_>void m_done(void** h);
_>// m.c
_>#include "m.h"
_>#include "m1.h"
_>#include "m2.h"
_>typedef struct {
_> void *h1,*h2;
_>} M;
_>int m_init(void** h) {
_> M *m; int r=1;
_> m=(M*)malloc(sizeof(M));
_> *h=m; if (!m) return 1;
m->>h1=0;
m->>h2=0;
_> if (m1_init(&m->h1)) goto leave;
_> if (m2_init(&m->h2)) goto leave;
_> r=0;
_>leave:
_> if(r) m_done(h);
_> return r;
_>}
_>void m_done(void** h) {
_> if (*h) {
_> M* m=(M*)*h;
_> m2_done(&m->h2);
_> m1_done(&m->h1);
_> free(m);
_> *h=0;
_> }
_>}
_>int m_fn(void* h) {
_> M *m=(M*)h;int r=1;
_> if (m1_fn(m->h1)) goto fail;
_> if (m2_fn(m->h2)) { r=2; goto fail; }
_> r=0;
_>fail:
_> return r;
_>}
_>
Это и есть самые типичные макароны. При увеличении количества ресурсов будет всё веселее и веселее.
Чисто на вскидку, даже учитывая что для уменьшения размеров ты писал по нескольку операторов на строке чего в реальном проекте тебе никто не даст сделать, посмотри сколько у тебя значимых строк (которые выполняют полезную работу), и сколько вспомогательных/технических (по сути мусор) — которые нужны только для обеспечения корректной работы значимых строк. В случае RAII и исключений количество технических строк будет равно нулю.