GNU CC 预定义了两个标志符保存当前函数的名字,__FUNCTION__ 保存函数在源码中的名字,__PRETTY_FUNCTION__ 保存带语言特色的名字。在 C 函数中,这两个名字是相同的,在 C++ 函数中,__PRETTY_FUNCTION__ 包括函数返回类型等额外信息,Linux 内核只使用了 __FUNCTION__。
通常,在调式中最让人烦恼的阶段是不断地检查是否已调用了特定的函数。对此问题,一个解决办法是,在函数里添加 printf() <针对 C 语言>,如:
但是,通常在一个典型的工程中,会包含有数千个函数,如果在每个函数中都加入一条这样的语句,那将非常痛苦。所以,现在有一种机制,可以自动玩成这项工作: __FUNCTION__
在最新的 ISO C 标准中,如 C99,加入了另一个有用的,类似于宏的表达式 __func__ ,它会报告未修饰过的(也就是未裁减过的)、正在被访问的函数名。注意,__func__ 不是一个宏,因为预处理器对此函数一无所知;相反,它是作为一个隐式声明的常量字符数组实现的:
在 function-name 处,为实际的函数名。
测试代码:
运行及输出:
说明:
__func__ 标识符为官方 C99 标准定义,但是 ISO C++ 却不完全支持所有的 C99 扩展。因此,大多数编译器提供商都使用 __FUNCTION__ 取而代之。__FUNCTION__ 通常是一个定义为 __func__ 的宏,之所以使用这个名字,是因为它已经得到了广泛的支持。
通常,在调式中最让人烦恼的阶段是不断地检查是否已调用了特定的函数。对此问题,一个解决办法是,在函数里添加 printf() <针对 C 语言>,如:
引用void func_test ()
{
printf(" func_test() ");
/* 其他代码 */
}
但是,通常在一个典型的工程中,会包含有数千个函数,如果在每个函数中都加入一条这样的语句,那将非常痛苦。所以,现在有一种机制,可以自动玩成这项工作: __FUNCTION__
在最新的 ISO C 标准中,如 C99,加入了另一个有用的,类似于宏的表达式 __func__ ,它会报告未修饰过的(也就是未裁减过的)、正在被访问的函数名。注意,__func__ 不是一个宏,因为预处理器对此函数一无所知;相反,它是作为一个隐式声明的常量字符数组实现的:
static const char __func__[] = "functon-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();
return 0;
}
运行及输出:
引用beyes@linux-beyes:~/C/GNU_C_EXT> ./FUNCTION.exe
fun_test
fun_test2
说明:
__func__ 标识符为官方 C99 标准定义,但是 ISO C++ 却不完全支持所有的 C99 扩展。因此,大多数编译器提供商都使用 __FUNCTION__ 取而代之。__FUNCTION__ 通常是一个定义为 __func__ 的宏,之所以使用这个名字,是因为它已经得到了广泛的支持。