__FUNCSIG__、__FUNCDNAME__、__FUNCTION__、__func__、__PRETTY_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__则会以 <return-type>  <class-name>::<member-function-name>(<parameters-list>) 的格式输出成员函数的详悉信息(只会输出parameters-list的形参类型而不会输出形参名).

2)若用gcc编译C程序,__PRETTY_FUNCTION____FUNCTION__的功能相同.

VC.NET提供的函数宏为:

__FUNCTION__ 函数,提供类名和函数名称的输出。


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
__PRETTY_FUNCTION__是一个宏,用于返回函数的详细信息,包括函数所属的类等信息。它与__func__和__FUNCTION__不同,后两者仅返回函数的名称,而__PRETTY_FUNCTION__返回更详细的信息。 在引用的例子中,可以看到使用__PRETTY_FUNCTION__时,输出的结果是"void MyClass::Class_Function()",其中包含了函数所属的类名和函数的参数信息。而使用__func__和__FUNCTION__时,只能得到函数的名称,无法获取其他详细信息。 因此,如果你需要获取函数更详细的信息,包括函数所属的类等信息,可以使用__PRETTY_FUNCTION__宏。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [__func__,__FUNCTION__,__PRETTY_FUNCTION__的区别](https://blog.csdn.net/CFH1021/article/details/121372590)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [__PRETTY_FUNCTION__, __FUNCTION__, __func__ 在C/C++中的差异?](https://blog.csdn.net/weixin_40463424/article/details/124566427)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值