В C. нет переносимого способа.
К счастью, это стандартная функция C ++ с деструкторами.
Изменить:
MSVC, похоже, имеет ключевые слова __try и __finally, которые можно использовать для этой же цели. Это отличается от обработки исключений C ++, и я думаю , что она доступна в C.
Я думаю, вы обнаружите, что очистка и try / finally не широко используются специально из-за неявной поддержки в C ++ , который «достаточно близок» к C, чтобы люди, заинтересованные в его поведении, могли легко переключить свой код на C ++.
void foo()
{
char *buf1 = 0, *buf2 = 0, *buf3 = 0;
/** more resource handle */
do {
if ( buf1 = ... , !buf1 ) break;
if ( buf2 = ... , !buf2 ) break;
if ( buf3 = ... , !buf3 ) break;
/** to acquire more resource */
/** to do with resource */
} while (0);
/** to release more resource */
if (buf3) free(buf3);
if (buf2) free(buf2);
if (buf1) free(buf1);
}
Для этой цели можно использовать boost :: shared_ptr.
boost::shared_ptr<char> buffer(p, cleanup);
Первая половина вашего вопроса - это портативный способ сделать это.