GNUC语⾔的扩展(五)__FUNCTION__预定义标志符GNU CC 预定义了两个标志符保存当前函数的名字,__FUNCTION__ 保存函数在源码中的名
字,__PRETTY_FUNCTION__ 保存带语⾔特⾊的名字。在 C 函数中,这两个名字是相同的,在 C++ 函数
中,__PRETTY_FUNCTION__ 包括函数返回类型等额外信息, 内核只使⽤了 __FUNCTION__。
通常,在调式中最让⼈烦恼的阶段是不断地检查是否已调⽤了特定的函数。对此问题,⼀个解决办法是,在函数⾥添加printf() <;针对 C 语⾔>,如:
引⽤
void func_test ()
{
printf(" func_test() ");
c语言编译器怎么玩/* 其他代码 */
}
但是,通常在⼀个典型的⼯程中,会包含有数千个函数,如果在每个函数中都加⼊⼀条这样的语句,那将⾮常痛苦。所以,现在有⼀种机制,可以⾃动玩成这项⼯作: __FUNCTION__
在最新的 ISO C 标准中,如 C99,加⼊了另⼀个有⽤的,类似于宏的表达式 __func__ ,它会报告未修饰过的(也就是未裁减过的)、正在被访问的函数名。注意,__func__ 不是⼀个宏,因为预处理器对此函数⼀⽆所知;相反,它是作为⼀个隐式声明的常量字符数组实现的:
static const char__func__[]="functon-name";
在 function-name 处,为实际的函数名。
测试代码:
引⽤
#include <stdio.h>
void show_name (const char*name)
{
printf("%s\n",name);
}
void fun_test ()
{
show_name (__FUNCTION__);
printf ("\n");
}
void fun_test2 ()
{
printf (__func__);
printf ("\n");
}
int main()
{
fun_test();
fun_test2();
return0;
}
运⾏及输出:
引⽤
beyes@linux-beyes:~/C/GNU_C_EXT> ./
fun_test
fun_test2
说明:
__func__ 标识符为官⽅ C99 标准定义,但是 ISO C++ 却不完全⽀持所有的 C99 扩展。因此,⼤多数编译器提供商都使⽤ __FUNCTION__ 取⽽代之。__FUNCTION__ 通常是⼀个定义为 __func__ 的宏,之所以使⽤这个名字,是因为它已经得到了⼴泛的⽀持。