【发布时间】:2021-11-21 14:37:07
【问题描述】:
如果我们在 C (C99 / C11) 和 C++ 中的函数之外使用预定义变量 __func__ 会发生什么?
#include <stdio.h>
const char* str = __func__;
int main(void)
{
printf("%s", str);
return 0;
}
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?错误?还是别的什么?
【问题讨论】:
-
我对错误投了赞成票,因为您的引文中使用了“函数局部预定义变量”和“紧跟在每个函数定义的左大括号之后”的措辞。
-
任何未由标准定义的行为,通过消除,都是未定义的行为;)