1. 主页
  2. 文档
  3. C语言教程
  4. C语言函数
  5. C中的预定义标识符__func__

C中的预定义标识符__func__

在我们开始讨论__func__之前,让我们编写一些代码片段并预测输出: 

#include <stdio.h>

int main()
{
printf("%s",__func__);
return 0;
}

由于未定义变量__func__会导致编译错误吗?好吧,正如您到目前为止所猜到的那样,它不会给出任何编译错误并且会打印main! 

C 语言标准(即 C99 和 C11)定义了一个预定义标识符,如下所示:

标识符 __func__ 应由翻译器隐式声明,就好像紧跟在每个函数定义的左大括号之后,声明
static const char __func__[] = “function-name”;
出现,其中 function-name 是词法封闭函数的名称。

这意味着 C 编译器在每个函数中隐式添加__func__以便可以在该函数中使用它来获取函数名。为了更好地理解它,让我们编写以下代码: 

#include <stdio.h>
void foo(void)
{
printf("%s",__func__);
}
void bar(void)
{
printf("%s",__func__);
}

int main()
{
foo();
bar();
return 0;
}

它将输出为foob​​ar。这个预定义标识符的一个用例可能是记录一个大程序的输出,程序员可以使用__func__来获取当前函数,而不是显式地提及完整的函数名称。现在如果我们再定义一个名为__func__的变量会发生什么 

#include <stdio.h>

int __func__ = 10;
int main()
{
printf("%d",__func__);
return 0;
}

由于 C 标准说编译器为每个函数隐式定义__func__作为函数名,我们不应该首先定义__func__如果有人明确定义__func__ ,您可能会收到错误,但 C 标准会说“未定义的行为” 。

为了结束对预定义标识符__func__的讨论,让我们也提到预定义宏(例如 __FILE__ 和 __LINE__ 等)。基本上,C 标准条款 6.10.8 提到了几个预定义宏,其中__FILE____LINE__与此处相关。 

看看以下代码片段的输出是值得的: 

#include <stdio.h>

int main()
{
printf("In file:%s, function:%s() and line:%d",__FILE__,__func__,__LINE__);

return 0;
}

我们不解释输出,而是让您猜测和理解__FILE____LINE__的作用!

这篇文章对您有用吗?