在开始讨论__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。另外,请留下您的评论以进一步澄清或获取信息。我们很乐意帮助和学习🙂