__func__ C和C++之间的值差异

Fro*_*art 8 c c++ c99 c++11 c11

我是否正确C标准保证_ _ func _ _ value始终是封闭函数的名称,而在C++中(我的意思是C++ 11),它可以是任何实现定义的字符串(例如,如果我们有没有参数的函数foo,我们可以得到像"Some string fdgdg asdfs fsdf sd"这样的东西?

ISO/IEC 9899:2011

6.4.2.2预定义标识符

语义

1标识符_ _ func _ _应由翻译器隐式声明,就像紧跟在每个函数定义的左括号之后的声明static const char _ func _ [] ="function-name"; 出现了,其中function-name是词法封闭函数的名称.

ISO/IEC 14882:2011

8.4.1一般[dcl.fct.def.general]

8函数本地预定义变量_ _ func _ _被定义为形式为static const char _ _ func _ _ [] ="function-name"的形式的定义; 已提供,其中function-name是实现定义的字符串.未指定此变量的地址是否与程序中任何其他对象的地址不同.

这是什么原因?如果我们无法接收当前的功能名称,请返回类似"未知"的内容?

Ben*_*igt 14

什么是C++中函数的"名称"?

  • 它的名称空间是否合格?
  • 是否由参数类型命名的重载函数?
  • 返回类型怎么样,不用于重载?
  • 功能模板会发生什么?
  • 调用约定是名称的一部分吗?
  • 应该在类型名称之前或之后写入'const'和'volatile'吗?

"实现定义的字符串"为编译器提供了一些灵活性,可以将所有这些信息填充到字符串中.并且它向程序员发送一条消息,您不应该尝试执行字符串比较或解析,或者实际上除了记录值之外还要执行任何操作(如果您想要可移植性).

(你甚至无法将这些值相互比较,因为不能保证它们是唯一的.似乎所有重载都可能产生相同的字符串.因此使用它来编译分析器统计信息是不明智的.)

  • @NikitaTrophimov:绝对是的.你的编译器*可能*附带了一个工具,可以用某种方式把它变成人类可识别的`foo`.但标准并不要求它这样做. (2认同)