2016-11-20 3 views
0

теперь у меня есть массив функций, которые имеют ту же функциональность,Как преобразовать указатель функции в имя функции?

func_pointer_t func_array[] = {func_1, func_2, func_3, ...}; 

Я хочу, чтобы разработать программу, которая проходит через все члены массива и сбрасывает вывод в другой .dat файл данных. Вывод должен иметь следующий формат:

func_1 func_1_output 
func_2 func_2_output 
func_3 func_3_output 
... 

Так что мой вопрос - при прохождении через элементы массива, как мы могли бы позволить программе знать, какие функции имя указатель функции указывает на (например, func_array [0] указывая на func_1)?

+1

http://stackoverflow.com/questions/351134/how-to-get-functions-name-from-functions-pointer-in -c – chasep255

+1

Вы отметили C++, почему бы не использовать карту ? – MyUsername112358

+2

Именные переменные/функции теряются во время компиляции. Они просто помогают программисту. – alk

ответ

5

Нет стандартного способа архивирования того, что вы ищете. Все возможные решения либо включать системы зависимых пути разрешения адреса функций к их именам (и даже это не обязательно всегда работает) или изменение func_array как так:

struct { 
    func_pointer_t func; 
    const char * name; 
} func_array[] = { 
    { func_1, "func_1" }, 
    { func_2, "func_2" }, 
    { func_3, "func_3" }, 
    ... 
}; 

вы можете использовать макрос, чтобы облегчить работу:

#define FUNC_DEF(func) { func, #func }, 

, а затем использовать его как это:

struct { 
    func_pointer_t func; 
    const char * name; 
} func_array[] = { 
    FUNC_DEF(func_1) 
    FUNC_DEF(func_2) 
    FUNC_DEF(func_3) 
    ... 
}; 

Так что, если это вариант для вас, вы получили свое решение. Если нет, вам нужно сказать, в какой системе вы нацеливаетесь.

Другие решения C++ ish существуют - как и решения std :: map, намеченные Govind Parmar, где вы можете выполнять итерацию и принимать ключ < -> пара значений.

+0

Ницет: Вы лучше капитализируете макрос. – alk

0

Необходимо помнить, что на уровне сборки/машинного кода нет «имен функций» (если у вас нет отладочной информации в вашей сборке); есть только адреса, указывающие, где начинается функция.

Вам нужно будет использовать структуру данных, чтобы отслеживать этот материал. Если вы используете C++, используйте map<string, function_pointer> в качестве комментатора @ MyUsername112358.

+0

'void * function_ptr;' всегда является ошибкой. Вы не должны смешивать указатели данных и указатели на функции. –

+0

@BodoThiesen ах вы правы; удалив часть C моего ответа независимо от того, как он сказал, что он работает строго с C++ –

1

Вы можете просто отслеживать имя, сохраняя массив пар, который будет соответствовать указатель на функцию с его именем:

std::pair<const char*, func_pointer_t>[] func_array = { 
    {"func_1", func_1}, 
    {"func_2", func_2}, 
    {"func_3", func_3} 
}; 

Вы теперь будете в состоянии использовать это имя тоже.

ли вы хотите, вы можете даже использовать карту:

std::map<std::string, func_ptr_t> func_array { 
    {"func_1", func_1}, 
    {"func_2", func_2}, 
    {"func_3", func_3} 
}; 
+0

Что здесь означает «вычурность»? –

+0

Это значит, что у моего телефона плохой автокорректор –

+0

Да, у меня есть один из них! –

Смежные вопросы