Fro*_*art 21 c c++ c99 c++11 c11
如果我们__func__在C(C99/C11)和C++中的函数外部使用预定义变量会发生什么?
#include <stdio.h>
const char* str = __func__;
int main(void)
{
printf("%s", str);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc 4.7.2只发出警告(-Wall -W -pedantic启用)并且不打印任何内容.
标准没有明确说明任何事情:
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?错误?或者是其他东西?
oua*_*uah 23
标准没有明确说明任何事情
这意味着未定义的行为.
从C标准(强调我的):
(C99,4.p2)"如果违反约束之外的''应'或''不得''要求,则行为未定义.本国际标准中未指明未定义的行为"未定义的行为" 或者忽略任何明确的行为定义.这三者之间的重点没有区别;它们都描述了"未定义的行为".
(根据之前的评论推广)
__func__在保留的命名空间中,允许实现在命名空间范围内用于任何目的,即实现不需要诊断(错误)使用__func__函数外部,因为标准中没有任何内容禁止实现定义__func__为命名空间范围数组,char如果这是实现者想要做的.
它可以是未定义的,也可以定义为字符串,或者其他任何东西,并且该实现仍然符合要求.
所以这是不确定的行为,试图使用它的功能之外,因为它可能会或可能不会进行定义和可能是也可能不是正确的类型是可用的.
有关问题中的代码在与符合实现一起使用时如何具有未定义行为的具体示例,我相信实现可以将其定义为nullptr(因此示例会崩溃printf)或者甚至可以将其定义为扩展为取消引用的宏一个空指针,然后#undef它在每个函数的入口和#define它后面的每个函数(所以示例将在main开始之前崩溃!)