GNU C语言的 扩展(五) __FUNCTION__ 预定义标志符

来源:互联网 发布:自然堂 淘宝销售额 编辑:程序博客网 时间:2024/05/21 18:40
GNU CC 预定义了两个标志符保存当前函数的名字,__FUNCTION__ 保存函数在源码中的名字,__PRETTY_FUNCTION__ 保存带语言特色的名字。在 C 函数中,这两个名字是相同的,在 C++ 函数中,__PRETTY_FUNCTION__ 包括函数返回类型等额外信息,Linux 内核只使用了 __FUNCTION__。



通常,在调式中最让人烦恼的阶段是不断地检查是否已调用了特定的函数。对此问题,一个解决办法是,在函数里添加 printf() <针对 C 语言>,如:
引用
voidfunc_test ()
{
   printf(" func_test() ");
   /* 其他代码 */
}

但是,通常在一个典型的工程中,会包含有数千个函数,如果在每个函数中都加入一条这样的语句,那将非常痛苦。所以,现在有一种机制,可以自动玩成这项工作: __FUNCTION__


在最新的 ISO C 标准中,如 C99,加入了另一个有用的,类似于宏的表达式 __func__ ,它会报告未修饰过的(也就是未裁减过的)、正在被访问的函数名。注意,__func__ 不是一个宏,因为预处理器对此函数一无所知;相反,它是作为一个隐式声明的常量字符数组实现的:
staticconst 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();
    return 0;
}

运行及输出
引用
beyes@linux-beyes:~/C/GNU_C_EXT> ./FUNCTION.exe
fun_test

fun_test2

说明
__func__ 标识符为官方 C99 标准定义,但是 ISO C++ 却不完全支持所有的 C99 扩展。因此,大多数编译器提供商都使用 __FUNCTION__ 取而代之。__FUNCTION__ 通常是一个定义为 __func__ 的宏,之所以使用这个名字,是因为它已经得到了广泛的支持。
0 0
原创粉丝点击