Периодически сталкиваюсь с ситуациями, когда нужно вызвать некоторое количество функций, которые имеют одинаковый прототип и результат выполнения которых нужно контролировать. Чтоб не прописывать проверку после вызова каждой функции, решил сделать всё в цикле.
int sx1509_init( struct BicOS* os ){
int res;
int i;
const struct {
int (*function)( struct BicOS* );
const char* name;
} initSequence[] = {
{ gpioSetup, "GPIO setup" },
{ deviceSetup, "Device setup" },
{ interruptHandlerSetup, "Interrupt handler setup" },
{ interruptEventHandlerSetup, "Interrupt event handler setup" },
{ keyboardSetup, "Keyboard setup" },
{ debug_key_printer_register, "Deug key printer" },
{ NULL, NULL }
};
for( i = 0; initSequence[i].function; i++ ){
res = initSequence[i].function( os );
if( res ){
printf( "{B} [sx1509] %s failed.\n", initSequence[i].name );
return -1;
}
}
return 0;
}
На первый взгляд оверхед у такого небольшой. Может у меня глаз замылился и я в упор не вижу подвоха? Какие у вас будут мнения на этот счёт?