Макрос / ключевое слово, которое можно использовать для вывода названия метода?

__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.

Другие вопросы по тегам