__函数定义外部的函数 如果在C(C99/C11)和C++ +中使用预定义变量 #包括 const char*str=\uuuu func\uuuuu; 内部主(空) { printf(“%s”,str); 返回0; }
gcc 4.7.2仅给出警告(启用__函数定义外部的函数 如果在C(C99/C11)和C++ +中使用预定义变量 #包括 const char*str=\uuuu func\uuuuu; 内部主(空) { printf(“%s”,str); 返回0; },c++,c,c++11,c99,c11,C++,C,C++11,C99,C11,gcc 4.7.2仅给出警告(启用-Wall-W-pedantic)且不打印任何内容 标准并没有明确说明这一点: ISO/IEC 14882:2011 8.4.1概述[dcl.fct.def.general] 8函数本地预定义变量\uuuuu func\uuuu定义为 形式static const char _func _[]=“函数名”的定义 已提供,其中函数名是定义的实现 一串未指定此类变量是否具有地址 不同于程序中任何其他对象的 ISO/IEC 9899:2011 6.4.2.2预定义标识
-Wall-W-pedantic
)且不打印任何内容
标准并没有明确说明这一点:
ISO/IEC 14882:2011
8.4.1概述[dcl.fct.def.general]
8函数本地预定义变量\uuuuu func\uuuu
定义为
形式static const char _func _[]=“函数名”的定义代码>
已提供,其中函数名是定义的实现
一串未指定此类变量是否具有地址
不同于程序中任何其他对象的
ISO/IEC 9899:2011
6.4.2.2预定义标识符
1译者应立即隐式声明标识符\uuuu func\uuu
在每个函数定义的左大括号之后
声明static const char\uuuu func\uuu[]=“函数名”代码>
出现,其中function name是词汇封闭的
功能
乌兰巴托?错误?还是别的什么
标准并没有明确地说明这一点
这意味着未定义的行为
根据C标准(重点矿山):
(C99,4.p2)如果违反了出现在约束范围之外的“应”或“不应”要求,则行为未定义。未定义的行为在本国际标准中用“未定义的行为”或省略任何明确的行为定义来表示。这三种行为在强调程度上没有区别;它们都描述了“未定义的行为”
(根据先前的评论升级)
\uuuu func\uuu
位于保留命名空间中,因此允许实现在命名空间范围内出于任何目的使用它,即不需要实现诊断(mis)在函数外部使用\uuuuu func\uuuu
,因为标准中没有任何内容禁止实现将\uuuuu func\uuuu
定义为char
的命名空间范围数组,如果实现者希望这样做的话
它可以是未定义的,也可以被定义为字符串或其他任何东西,并且该实现仍然是一致的
因此,尝试在函数外部使用它是未定义的行为,因为它可能被定义,也可能没有定义,也可能没有正确的可用类型
对于问题中的代码在与一致性实现一起使用时如何具有未定义行为的具体示例,我相信实现可以将其定义为nullptr
(因此示例将在printf
中崩溃)或者甚至可以将其定义为一个宏,该宏扩展为一个空指针的解引用,然后在每个函数的条目上定义它,并在每个函数之后定义它(因此示例将在main
开始之前崩溃!)鉴于“函数局部预定义变量”和紧跟在引文中每个函数定义的开始括号之后。标准中未定义的任何行为,通过排除,都是未定义的行为;)+1,用于全面解释,而不是仅用于迂腐的引用。
#include <stdio.h>
const char* str = __func__;
int main(void)
{
printf("%s", str);
return 0;
}