LINUX.ORG.RU

Покритикуйте подход: запуск функций из массива указателей

 


0

2

Периодически сталкиваюсь с ситуациями, когда нужно вызвать некоторое количество функций, которые имеют одинаковый прототип и результат выполнения которых нужно контролировать. Чтоб не прописывать проверку после вызова каждой функции, решил сделать всё в цикле.

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;
}

На первый взгляд оверхед у такого небольшой. Может у меня глаз замылился и я в упор не вижу подвоха? Какие у вас будут мнения на этот счёт?

★★

Последнее исправление: u5er (всего исправлений: 1)
Ответ на: комментарий от u5er

Ну это пока, во первых уже потеряешь сообщение, во вторых на перспективу возможно ты решишь передавать name в вызываемую функцию например, а в ней разыменование…, или просто что-то делать со строкой перед выводом. Да мало ли что будет у тебя дальше в перспективе. Я про это, но это я так, на правах паранойи. А так, то, как и говорил всё хорошо. Ты спросил мнение я ответил.

Да и printf мы спустя время может решишь свой сделать. Это всё такие не очевидные вещи. Нужно ли тебе их учитывать, а фиг его знает, может и нет.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)