📜  C中的预定义标识符__func__

📅  最后修改于: 2021-05-24 16:48:57             🧑  作者: 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基础课程》。