如果我们在C(C99 / C11)和C ++中的函数外部使用预定义变量__func__
,会发生什么?
#include <stdio.h>
const char* str = __func__;
int main(void)
{
printf("%s", str);
return 0;
}
仅在启用-Wall -W -pedantic
选项时,gcc 4.7.2只会发出警告而不打印任何内容。
标准并没有明确说明:
ISO/IEC 14882:2011
8.4.1 一般情况 [dcl.fct.def.general]
8 函数局部预定义变量
__func__
的定义效果就好像提供了一个形式为static const char __func__[] = "function-name";
的定义,其中function-name是一个实现定义的字符串。未指定此类变量是否具有与程序中任何其他对象不同的地址。
ISO/IEC 9899:2011
6.4.2.2 预定义标识符
1 标识符
__func__
应被编译器隐式声明,好像在每个函数定义的左括号后面紧跟着出现了声明static const char __func__[] = "function-name";
,其中function-name是包围该标识符的函数的名称。
UB?错误?还是其他什么东西?