在我们开始讨论__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。另外,请给我们留言以获得进一步的说明或信息。我们很乐意帮助和学习🙂