Макрос / ключевое слово, которое можно использовать для вывода названия метода? - PullRequest
42 голосов
/ 03 февраля 2010

__FILE__ и __LINE__ хорошо известны. Начиная с C99, __func__.

#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 ]

78 голосов
/ 03 февраля 2010

Boost имеет специальный служебный макрос под названием BOOST_CURRENT_FUNCTION , который скрывает различия между реализациями компилятора.

Следуя его реализации, мы видим, что в зависимости от компилятора существует несколько макросов:

  • __PRETTY_FUNCTION__ - GCC, MetroWerks, Digital Mars, ICC, MinGW
  • __FUNCSIG__ - MSVC
  • __FUNCTION__ - Intel и IBM
  • __FUNC__ - Borland
  • __func__ - ANSI C99
8 голосов
/ 03 февраля 2010
  • В GCC вы можете использовать __FUNCTION__ и __PRETTY_FUNCTION__.
  • В MSVC вы можете использовать __FUNCSIG__ и __FUNCTION__.
3 голосов
/ 03 февраля 2010

В стандарте C ++ такого макроса нет, и он включает в себя черновой стандарт C ++ 0x, на который я смотрел. Это усложнит компиляцию, поскольку разбор (необходимый для определения функции) выполняется после предварительной обработки, и я подозреваю, что в стандарте ничего нет.

__func__, который вы используете, нестандартный, хотя, очевидно, он работает на вашем компиляторе.

1 голос
/ 03 февраля 2010

См. « Предопределенные макросы (C / C ++) » для получения полного списка поддерживаемых MS Visual Studio.

1 голос
/ 03 февраля 2010

Не в стандарте C ++ (и __func__ не является частью C ++). В вашей реализации может быть такая возможность - какой компилятор вы используете?

0 голосов
/ 08 мая 2014

Это может быть полезно:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...