Я думаю, вы могли бы построить свою таблицу, используя строки (имена функций) в качестве ключей, а затем поискать по сравнению со встроенной переменной __func__
.
Чтобы обеспечить наличие действительного имени функции, вы можете использовать макрос, который получает указатель на функцию, выполняет с ней некоторую фиктивную операцию (например, присваивает ее временной переменной совместимого типа функции), чтобы убедиться, что это действительно допустимый идентификатор функции, а затем преобразует в строку (с #) имя функции, прежде чем использовать ее в качестве ключа.
UPDATE:
Я имею в виду что-то вроде:
typedef struct {
char[MAX_FUNC_NAME_LENGTH] func_name;
//rest of the info here
} func_info;
func_info table[N_FUNCS];
#define CHECK_AND_GET_FUNC_NAME(f) ({void (*tmp)(int); tmp = f; #f})
void fill_it()
{
int i = -1;
strcpy(table[++i].func_name, CHECK_AND_GET_FUNC_NAME(foo));
strcpy(table[++i].func_name, CHECK_AND_GET_FUNC_NAME(bar));
//fill the rest
}
void lookup(char *name) {
int i = -1;
while(strcmp(name, table[++i]));
//now i points to your entry, do whatever you need
}
void foo(int arg) {
lookup(__func__);
//do something
}
void bar(int arg) {
lookup(__func__);
//do something
}
(код может нуждаться в некоторых исправлениях, я не пытался его скомпилировать, это просто для иллюстрации идеи)