#define CLEANUPBLK(name) \
int __##name##_cleanup_code; \
{
#define CLEANUPBEG(name, val) \
} \
__##name##_cleanup_clean: \
__##name##_cleanup_code = val; \
__##name##_cleanup_select_clean: \
switch (__##name##_cleanup_code) \
{ \
case val:
#define CLEANUPNEXT(name, val) \
case val:
#define CLEANUPEND(name) \
default: \
goto __##name##_cleanup_break; \
goto __##name##_cleanup_clean; \
goto __##name##_cleanup_select_clean; \
} \
__##name##_cleanup_break:
#define CLEANUPALL(name) \
goto __##name##_cleanup_clean
#define CLEANUPBRK(name) \
goto __##name##_cleanup_break
#define CLEANUPSEL(name, val) \
__##name##_cleanup_code = val; \
goto __##name##_cleanup_select_clean
int main()
{
CLEANUPBLK()
{
if (!init1())
CLEANUPBRK();
if (!init2())
CLEANUPSEL(, 1);
if (!init3())
CLEANUPSEL(, 2);
if (!init4())
CLEANUPSEL(, 3);
if (!some_func())
CLEANUPALL();
some_func2();
}
CLEANUPBEG(, 0)
{
clean4();
}
CLEANUPNEXT(, 3)
{
clean3();
}
CLEANUPNEXT(, 2)
{
clean2();
}
CLEANUPNEXT(, 1)
{
clean1();
}
CLEANUPEND();
return 0;
}
Интересно узнать кто как решает данную проблему в языке си? init - берет ресурс, clean - освобождает ресурс.
PS: Раньше на си серьезно не писал, а писал на с++ и что то слишком много макросов начал использовать.
←
1
2
→
Ответ на:
комментарий
от tailgunner

Ответ на:
комментарий
от www_linux_org_ru

Ответ на:
комментарий
от www_linux_org_ru

Ответ на:
комментарий
от www_linux_org_ru

Ответ на:
комментарий
от www_linux_org_ru

Ответ на:
комментарий
от alex4

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Си - макрос случайной строки (2007)
- Форум Понеслась (2015)
- Форум Понеслась (2008)
- Форум Телегу понесло (2017)
- Форум Ну понеслася (2007)
- Форум вызов generic_make_request из обработчика запросов блочного устройства (2019)
- Форум Макрос (2018)
- Форум Макросы (2012)
- Форум макросы (2001)
- Форум Макрос раскрывает код макроса (2018)