Макрос / ключевое слово, которое можно использовать для вывода названия метода?
__FILE__
а также __LINE__
хорошо известны. E сть __func__
с C99.
#include <iostream>
struct Foo {
void Do(){ std::cout << __func__ << std::endl; }
};
int main()
{
std::cout << __func__ << std::endl;
Foo foo; foo.Do();
return 0;
}
будет выводить
main
Do
Есть ли макрос / ключевое слово, которое выводит имя метода, например Foo::Do
?
6 ответов
В Boost есть специальный служебный макрос BOOST_CURRENT_FUNCTION, который скрывает различия между реализациями компилятора.
Следуя его реализации, мы видим, что есть несколько макросов в зависимости от компилятора:
__PRETTY_FUNCTION__
- GCC, MetroWerks, Digital Mars, ICC, MinGW__FUNCSIG__
- MSVC__FUNCTION__
- Intel и IBM__FUNC__
- Borland__func__
- ANSI C99
- На GCC вы можете использовать
__FUNCTION__
а также__PRETTY_FUNCTION__
, - На MSVC вы можете использовать
__FUNCSIG__
а также__FUNCTION__
,
В стандарте C++ такого макроса нет, и он включает в себя проект стандарта C++0x, на который я смотрел. Это усложнит компиляцию, так как разбор (необходимый для определения функции) происходит после предварительной обработки, и я подозреваю, поэтому в стандарте ничего нет.
__func__
вы используете нестандартный, хотя он, очевидно, работает на вашем компиляторе.
См. " Предопределенные макросы (C / C++)" для получения полного списка поддерживаемых MS Visual Studio.
Не в стандарте C++ (и __func__
не является частью C++). Ваша реализация может иметь такую особенность - какой компилятор вы используете?
Это может быть полезно:
http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html
#include"stdio.h"
#include"stdlib.h"
int main()
{
printf("line number is %d .. func name is %s, file name is %s",__LINE__,__PRETTY_FUNCTION__,__FILE__);
return 0;
}
Это как напечатать номер строки, имя функции и имя файла в gcc.