Re: Имя функции в строку
От: remark Россия http://www.1024cores.net/
Дата: 19.11.09 12:55
Оценка: 15 (5)
Здравствуйте, Посторонним В., Вы писали:

ПВ>Можно ли получить (во время компиляции) имя функции в виде строки?

ПВ>Макры вроде __FUNCTION__ и __function__ не годятся потому как для этого ф-ю надо вызывать.

Зависит от того, что именно надо, но вообще __FUNCTION__ можно использовать и не вызывая саму функцию.
Есть такой трюк:

template<void(*)(void*)>
void print_function_name()
{
    std::cout << __FUNCSIG__ << std::endl;
}

int main()
{
    print_function_name<free>();
}


У меня выводит:

void __cdecl print_function_name<void __cdecl free(void *)>(void)


Из чего можно выковырять имя целевой функции.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Имя функции в строку
От: Alexander G Украина  
Дата: 18.11.09 23:17
Оценка: +2
Здравствуйте, Посторонним В., Вы писали:

ПВ>Можно ли получить (во время компиляции) имя функции в виде строки?

ПВ>Макры вроде __FUNCTION__ и __function__ не годятся потому как для этого ф-ю надо вызывать.

Из чего? Из идентификатора — стрингизировать макроопертором #. Из указателя на функцию — вряд ли.
Русский военный корабль идёт ко дну!
Имя функции в строку
От: Посторонним В. Беларусь  
Дата: 18.11.09 22:59
Оценка:
Можно ли получить (во время компиляции) имя функции в виде строки?
Макры вроде __FUNCTION__ и __function__ не годятся потому как для этого ф-ю надо вызывать.
Re[2]: Имя функции в строку
От: Посторонним В. Беларусь  
Дата: 19.11.09 14:04
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Посторонним В., Вы писали:


ПВ>>Можно ли получить (во время компиляции) имя функции в виде строки?


R>Есть такой трюк:


R>
[...]
R>

R>Из чего можно выковырять имя целевой функции.

Спасибо! Работает для свободныз ф-й, а фот для членов класс не выходит
struct Iface
{
    virtual void f1() = 0;
    virtual void f2(int) = 0;
};

template <void (Iface::*)(void*)>
string getFunctionName()
{
    string s = __FUNCSIG__;
    return s;
}

int main()
{
std::cout << getFunctionName<Iface::f1>() << std::endl;
}


error C3867: 'Iface::f1': function call missing argument list; use '&Iface::f1' to create a pointer to member

Re[3]: Имя функции в строку
От: tlamer  
Дата: 19.11.09 14:18
Оценка:
ПВ>Спасибо! Работает для свободныз ф-й, а фот для членов класс не выходит
ПВ>
ПВ>struct Iface
ПВ>{
ПВ>    virtual void f1() = 0;
ПВ>    virtual void f2(int) = 0;
ПВ>};

ПВ>template <void (Iface::*)(void*)>
ПВ>string getFunctionName()
ПВ>{
ПВ>    string s = __FUNCSIG__;
ПВ>    return s;
ПВ>}

ПВ>int main()
ПВ>{
ПВ>std::cout << getFunctionName<&Iface::f1>() << std::endl; // нужен &
ПВ>}
ПВ>



class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl getFunctionName<void __t
hiscall Iface::`vcall'{0}'(void)>(void)
Re[4]: Имя функции в строку
От: Посторонним В. Беларусь  
Дата: 19.11.09 14:26
Оценка:
Здравствуйте, tlamer, Вы писали:

ПВ>>Спасибо! Работает для свободных ф-й, а вот для членов класса не выходит

ПВ>>
ПВ>>struct Iface
ПВ>>{
ПВ>>    virtual void f1() = 0;
ПВ>>    virtual void f2(int) = 0;
ПВ>>};

ПВ>>template <void (Iface::*)(void*)>
ПВ>>string getFunctionName()
ПВ>>{
ПВ>>    string s = __FUNCSIG__;
ПВ>>    return s;
ПВ>>}

ПВ>>int main()
ПВ>>{
ПВ>>std::cout << getFunctionName<&Iface::f1>() << std::endl; // нужен &
ПВ>>}
ПВ>>



T>class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl getFunctionName<void __t

T>hiscall Iface::`vcall'{0}'(void)>(void)

И "f1" блин потерялось
Re[3]: Имя функции в строку
От: Кодт Россия  
Дата: 19.11.09 14:50
Оценка:
Здравствуйте, Посторонним В., Вы писали:

ПВ>Спасибо! Работает для свободныз ф-й, а фот для членов класс не выходит

Тебе компилятор подсказывает, как правильно:
ПВ>
ПВ>std::cout << getFunctionName<&Iface::f1>() << std::endl;
//                              ^
ПВ>


ПВ>

ПВ>error C3867: 'Iface::f1': function call missing argument list; use '&Iface::f1' to create a pointer to member

... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.