These articles are written by Codalogic empowerees as a way of sharing knowledge with the programming community. They do not necessarily reflect the opinions of Codalogic.
If you play around with exploring the order in which functions are called in C++
you might have a lot of code that looks like std::cout << "in foo()";
,
std::cout << "in bar();
.
If so, GCC's and Clang's __FUNCTION__
and __PRETTY_FUNCTION__
definitions may save you some effort and possibly
some errors.
They are similar to the standard __FILE__
and __LINE__
definitions but in this case
they print the name of the function in which they are used.
__FUNCTION__
simply displays the name of the function (e.g. func
), whereas in C++ __PRETTY_FUNCTION__
includes the type information with the name (e.g. void func(const std::string&)
).
In C, __PRETTY_FUNCTION__
displays the same as __FUNCTION__
, presumably because C doesn't do name mangling.
Here's some example code (available here: https://godbolt.org/z/7dr5Ef6ss):
#include <iostream>
int func(int)
{
std::cout << "__FUNCTION__ = " << __FUNCTION__ << "\n";
std::cout << "__PRETTY_FUNCTION__ = " << __PRETTY_FUNCTION__ << "\n\n";
return 0;
}
void func( const std::string & s )
{
std::cout << "__FUNCTION__ = " << __FUNCTION__ << "\n";
std::cout << "__PRETTY_FUNCTION__ = " << __PRETTY_FUNCTION__ << "\n\n";
}
struct A
{
A()
{
std::cout << "__FUNCTION__ = " << __FUNCTION__ << "\n";
std::cout << "__PRETTY_FUNCTION__ = " << __PRETTY_FUNCTION__ << "\n\n";
}
void who_am_i( void )
{
std::cout << "__FUNCTION__ = " << __FUNCTION__ << "\n";
std::cout << "__PRETTY_FUNCTION__ = " << __PRETTY_FUNCTION__ << "\n\n";
}
~A()
{
std::cout << "__FUNCTION__ = " << __FUNCTION__ << "\n";
std::cout << "__PRETTY_FUNCTION__ = " << __PRETTY_FUNCTION__ << "\n\n";
}
};
int main()
{
func(0);
func("");
A a;
a.who_am_i();
std::cout << "__FUNCTION__ = " << __FUNCTION__ << "\n";
std::cout << "__PRETTY_FUNCTION__ = " << __PRETTY_FUNCTION__ << "\n\n";
}
This outputs:
__FUNCTION__ = func
__PRETTY_FUNCTION__ = int func(int)
__FUNCTION__ = func
__PRETTY_FUNCTION__ = void func(const std::string&)
__FUNCTION__ = A
__PRETTY_FUNCTION__ = A::A()
__FUNCTION__ = who_am_i
__PRETTY_FUNCTION__ = void A::who_am_i()
__FUNCTION__ = main
__PRETTY_FUNCTION__ = int main()
__FUNCTION__ = ~A
__PRETTY_FUNCTION__ = A::~A()
I wish I had discovered this earlier!!!
February 2023
January 2023
December 2022
November 2022
October 2022
September 2022
August 2022
November 2021
June 2021
May 2021
April 2021
March 2021
October 2020
September 2020
September 2019
March 2019
June 2018
June 2017
August 2016