С++, получить имя функции

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Реализация, описанная здесь: fooobar.com/questions/103227/...

Вариант 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__, но предоставить опционное определение препроцессору, чтобы определить его, если оно undefined:

 #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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

Я не уверен на 100%, но мне это кажется отражением (Java), а С++ не поддерживает такие вещи. Возможно, я просто не знаю, но я еще не видел этого для С++.