FUNCTION 和 __func__基本上是相通的,一些老版本的C 和C++支持 func,这个宏用来获取当前函数的名字。而__PRETTY_FUNCTION__是用来返回函数的详细信息,通过此宏,我们可以知道这个函数属于那个类等信息。
一.举例说明
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
class MyClass{
public:
void Class_Function(){
cout << "The result of __PRETTY_FUNCTION__:" << __PRETTY_FUNCTION__ << endl;
}
};
void TestFunction(){
cout << "Output of __FUNCTION__is:" << __FUNCTION__<< endl;
}
int main(){
cout << "Output of __FUNCTION__ is:" << __FUNCTION__ << endl;
TestFunction();
MyClass MyObj;
MyObj.Class_Function();
return 0;
}
输出:
Output of __FUNCTION__ is:main
Output of __FUNCTION__is:TestFunction
The result of __PRETTY_FUNCTION__:void MyClass::Class_Function()
二。历史背景
在ISO C标准中,如大家所知的C99,加入了另一个有用的、类似宏的表达式__func__,其会报告未修饰过的(也就是未裁剪过的)、正在被访问的函数名。请注意,func__不是一个宏,因为预处理器对此函数一无所知;相反,它是作为一个隐式声明的常量字符数组实现的:
static const char func[] = “function-name”;
官方C99标准为此目的定义的__func__标识符,确实值得大家关注,然而,ISO C++却不完全支持所有的C99扩展,因此,大多数的编译器提供商都使用 FUNCTION 取而代之,而 FUNCTION 通常是一个定义为 func 的宏,之所以使用这个名字,是因为它已受到了大多数的广泛支持。
在Visual Studio 2005中,默认情况下,此特性是激活的,但不能与/EP和/P编译选项同时使用。请注意在IDE环境中,不能识别__func ,而要用__FUNCTION__ 代替。
Comeau的用户也应使用 FUNCTION ,而不是 func 。
C++ BuilderX的用户则应使用稍稍不同的名字:FUNC 。
GCC 3.0及更高的版本同时支持 func 和__FUNCTION__ 。
FUNCTION 特性最初是为C语言设计的,然而,C++程序员也会经常需要有关他们函数的额外信息,在Visual Studio 2005中,还支持另外两种非标准的扩展特性:FUNCDNAME 与 FUNCSIG ,其分别转译为一个函数的修饰名与签名。
例子
int test(int x)
vs2010
FUNCTION:test
FUNCDNAME:?test@@YAHH@Z
FUNCSIG:int __cdecl test(int)
gcc
FUNCTION:test
func:test
三.差异对比
GCC实现了如下的函数宏:
func C99的标准,但是GCC只输出函数名称。不知道VC.NET 为啥不支持
FUNCTION__同__func,
PRETTY_FUNCTION 非标准宏。这个宏比__FUNCTION__功能更强:
1)若用g++编译C++程序, __FUNCTION__只能输出类的成员函数名,不会输出类名;而__PRETTY_FUNCTION__则会以 ::() 的格式输出成员函数的详悉信息(注: 只会输出parameters-list的形参类型, 而不会输出形参名).
2)若用gcc编译C程序,__PRETTY_FUNCTION__跟__FUNCTION__的功能相同.
而VS2017提供的函数宏为:
FUNCTION 函数,提供类名和函数名称的输出。
参考链接:https://www.tutorialspoint.com/what-s-the-difference-between-pretty-function-function-func-in-c-cplusplus
https://blog.csdn.net/weiwangchao_/article/details/12494021