Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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__ не является частью С++). Возможно, ваша реализация может иметь такую ​​функцию - какой компилятор вы используете?

Ответ 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.