Макро/ключевое слово, которое можно использовать для печати имени метода?
__FILE__
и __LINE__
хорошо известны. Существует __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
?
Ответы
Ответ 1
Boost имеет специальный макрос утилиты, называемый BOOST_CURRENT_FUNCTION, который скрывает различия между реализациями компилятора.
После реализации мы видим, что в зависимости от компилятора есть несколько макросов:
-
__PRETTY_FUNCTION__
- GCC, MetroWerks, Digital Mars, ICC, MinGW
-
__FUNCSIG__
- MSVC
-
__FUNCTION__
- Intel и IBM
-
__FUNC__
- Borland
-
__FUNC__
- ANSI C99
Ответ 2
- В GCC вы можете использовать
__FUNCTION__
и
__PRETTY_FUNCTION__
.
- В MSVC вы можете использовать
__FUNCSIG__
и __FUNCTION__
.
Ответ 3
В стандартном С++ нет такого макроса, который включает в себя проект стандарта С++ 0x, на который я смотрел. Это усложнит компиляцию, поскольку после предварительной обработки возникает синтаксический анализ (необходимый для определения функции), и я подозреваю, что в стандарте ничего нет.
Используемый __func__
нестандартен, хотя он, по-видимому, работает на вашем компиляторе.
Ответ 4
Не в стандартном С++ (и __func__
не является частью С++). Возможно, ваша реализация может иметь такую функцию - какой компилятор вы используете?
Ответ 5
См. " Предопределенные макросы (C/С++)" для полного списка, поддерживаемого MS Visual Studio.
Ответ 6
Это может быть полезно:
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.