Получить имя вызываемой функции как строку
Я хотел бы отобразить имя функции, которую я вызываю. Вот мой код
void (*tabFtPtr [nbExo])(); // Array of function pointers
int i;
for (i = 0; i < nbExo; ++i)
{
printf ("%d - %s", i, __function__);
}
Я использовал __function__
в качестве примера, потому что он довольно близок к тому, что мне хотелось бы, но я хочу отобразить имя функции, обозначенной tabFtPtr [nbExo]
.
Спасибо, что помогли мне:)
Ответы
Ответ 1
Вам нужен компилятор C, который следует за стандартом C99 или позже. Существует предопределенный идентификатор, называемый __func__
, который делает то, о чем вы просите.
void func (void)
{
printf("%s", __func__);
}
Edit:
Как любопытная ссылка, стандарт C 6.4.2.2 диктует, что вышесказанное точно так же, как если бы вы явно писали:
void func (void)
{
static const char f [] = "func"; // where func is the function name
printf("%s", f);
}
Изменить 2:
Итак, для получения имени через указатель функции вы можете построить что-то вроде этого:
const char* func (bool whoami, ...)
{
const char* result;
if(whoami)
{
result = __func__;
}
else
{
do_work();
result = NULL;
}
return result;
}
int main()
{
typedef const char*(*func_t)(bool x, ...);
func_t function [N] = ...; // array of func pointers
for(int i=0; i<N; i++)
{
printf("%s", function[i](true, ...);
}
}
Ответ 2
Я не уверен, что это то, что вы хотите, но вы могли бы сделать что-то вроде этого. Объявите структуру для хранения имени и адреса функции и массива функций в области файлов:
#define FNUM 3
struct fnc {
void *addr;
char name[32];
};
void (*f[FNUM])();
struct fnc fnames[FNUM];
Инициализируйте их в своем коде вручную по имени функции, например.
fnames[0] = (struct fnc){foo1, "foo1"}; // function address + its name
fnames[1] = (struct fnc){foo2, "foo2"};
fnames[2] = (struct fnc){foo3, "foo3"};
Сделайте функцию для поиска массива, например
char *getfname(void *p)
{
for (int i = 0; i < FNUM; i++) {
if (fnames[i].addr == p)
return fnames[i].name;
}
return NULL;
}
Я быстро проверил это. Я инициализировал массив в main
и назвал foo1()
. Здесь моя функция и вывод:
void foo1(void)
{
printf("The pointer of the current function is %p\n", getfnp(__func__));
printf("The name of this function is %s\n", getfname(getfnp(__func__)));
printf("The name of the function at pointer f[2] (%p) is '%s'\n", f[2],
getfname(f[2]));
}
The pointer of the current function is 0x400715
The name of this function is foo1
The name of the function at pointer f[2] (0x40078c) is 'foo3'
Или, в более общем плане:
void foo2(void)
{
for (int i = 0; i < FNUM; i++) {
printf("Function f[%d] is called '%s'\n", i, getfname(f[i]));
}
}
Function f[0] is called 'foo1'
Function f[1] is called 'foo2'
Function f[2] is called 'foo3'