📜  C 中的预定义标识符 __func__

📅  最后修改于: 2021-10-23 07:40:02             🧑  作者: Mango

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

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

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

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

标识符 __func__ 应由翻译器隐式声明,就好像紧跟在每个函数定义的左大括号之后,声明

static const char __func__[] = “函数名”;

出现了,其中 function-name 是词法封闭函数的名称。

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

#include 
void foo(void)
{
   printf("%s",__func__);
}
void bar(void)
{
   printf("%s",__func__);
}
  
int main()
{
   foo();
   bar();
   return 0;
}

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

#include 
  
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 
  
int main()
{
   printf("In file:%s, function:%s() and line:%d",__FILE__,__func__,__LINE__);
  
   return 0;
}

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

如果您觉得以上有用,请点赞/推特/G+1。另外,请给我们留言以获得进一步的说明或信息。我们很乐意帮助和学习🙂

想要从精选的视频和练习题中学习,请查看C 基础到高级C 基础课程