Я использую структуру указателей функций для реализации интерфейса для разных бэкендов. Подписи очень разные, но возвращаемые значения почти все void, void * или int.
struct my_interface {
void (*func_a)(int i);
void *(*func_b)(const char *bla);
...
int (*func_z)(char foo);
};
Но не требуется, чтобы серверы поддерживали функции для каждой функции интерфейса. Поэтому у меня есть две возможности: первый вариант - проверять перед каждым вызовом, если указатель не равен NULL. Мне это очень не нравится из-за удобочитаемости и потому, что я боюсь воздействия производительности (однако, я его не оценил). Другой вариант - иметь фиктивную функцию, для редких случаев функция интерфейса не существует.
Поэтому мне нужна фиктивная функция для каждой подписи, интересно, возможно ли иметь только одно значение для разных возвращаемых значений. И приложите его к данной сигнатуре.
#include <stdio.h>
int nothing(void) {return 0;}
typedef int (*cb_t)(int);
int main(void)
{
cb_t func;
int i;
func = (cb_t) nothing;
i = func(1);
printf("%d\n", i);
return 0;
}
Я тестировал этот код с помощью gcc, и он работает. Но разумно ли это? Или это может привести к повреждению стека или может вызвать другие проблемы?
EDIT: благодаря всем ответам, я узнал теперь много о вызывать соглашения, после немного дальнейшего чтения. И теперь гораздо лучше понять, что происходит под капотом.