C ++, получить имя функции - PullRequest
13 голосов
/ 20 июня 2010

В C ++ есть ли способ получить сигнатуру / имя функции из ее указателя следующим образом?

void test(float data) {}
cout << typeid(&test).name();

Я хочу использовать эти данные для регистрации.

Ответы [ 5 ]

19 голосов
/ 08 июля 2013

C ++, получить имя вызывающей функции через указатель:

Вариант 1: сверните свой собственный регистратор имен функций

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

Реализация, описанная здесь: https://stackoverflow.com/a/8752173/445131

Вариант 2: Использование __func__

GCC предоставляет эту магическую переменную, которая содержит имя текущей функции в виде строки. Это часть стандарта C99:

#include <iostream>
using namespace std;
void foobar_function(){
    cout << "the name of this function is: " << __func__ << endl;
}
int main(int argc, char** argv) {
    cout << "the name of this function is: " << __func__ << endl;
    foobar_function();
    return 0;
}

Выход:

the name of this function is: main
the name of this function is: foobar_function

Примечания:

__FUNCTION__ - это другое имя для __func__. Более старые версии GCC распознают только это имя. Однако это не стандартизировано. Если требуется максимальная переносимость, мы рекомендуем использовать __func__, но предоставить препроцессору альтернативное определение, чтобы определить его, если оно не определено:

 #if __STDC_VERSION__ < 199901L
 # if __GNUC__ >= 2
 #  define __func__ __FUNCTION__
 # else
 #  define __func__ "<unknown>"
 # endif
 #endif

Источник: http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html

15 голосов
/ 20 июня 2010

Если вы просто хотите записать текущее имя функции, у большинства компиляторов есть макрос __FUNCTION__, который даст вам текущее имя функции во время компиляции.

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

3 голосов
/ 20 июня 2010

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

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

Также попробуйте открыть исполняемый файл в каком-либо редакторе и найти имя функции.Скорее всего, вы его не найдете.

Однако вы можете поместить некоторые программные «украшения», которые помогут вам обнаружить имя вашей функции во время выполнения.

1 голос
/ 20 июня 2010

Вы не можете получить имя функции в C ++, но вы можете напечатать указатель и позже проверить двоичный файл (если не удален) для имени функции.Подпись может быть напечатана точно так же, как вы делаете, только то, что имя типа на самом деле не «читабельно».Проверьте документацию вашего компилятора, что означает вывод вашего кода.В g ++ вывод будет PFvfE, что я не совсем понимаю, но идентифицирует указатель (P) на функцию (F), возвращающую void (v) и принимающую float (f) в качестве единственного аргумента.Не спрашивайте меня, что такое E ...

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

0 голосов
/ 20 июня 2010

Я не уверен на 100%, но мне кажется, что это рефлексия (Java), и C ++ не поддерживает подобные вещи.Может быть, я просто не знаю, но я еще не видел это для C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...