C++11 __func__预定义标识符
【1】__func__预定义标识符
很多现代的编译器都支持C99标准中的__func__预定义标识符功能,其基本功能就是返回所在函数的名字。
常见的用法,看下面这个例子:
#include <iostream> using namespace std; const char* hello() { return __func__; } const char* world() { return __func__; } int main() { cout << hello() << ", " << world() << endl; // hello, world }
上例中,定义了两个函数hello和world。利用__func__预定义标识符,我们返回了函数的名字,并将其打印出来。
事实上,按照标准定义,编译器会隐式地在函数的定义之后定义__func__标识符。
比如上述例子中的hello函数,其实际的定义等同于如下代码:
const char* hello() { static const char* __func__ = "hello"; return __func__; }
【2】C++11中的区别
在C++11中,标准甚至允许其使用在类或者结构体中。可以看看下面这个例子:
#include <iostream> using namespace std; struct TestStruct { TestStruct() : name(__func__) {} const char* func() { return __func__; } // void funcFail(string func_name = __func__); // E1036 保留的标识符 "__func__" 只能在函数内部使用 const char* name; }; int main() { TestStruct ts; cout << ts.name << endl; // TestStruct cout << ts.func() << endl; // func }
从代码中可以看到,在结构体的构造函数中,初始化成员列表使用__func__预定义标识符是可行的,其效果跟在函数中使用一样。
不过将__fun__标识符作为函数参数的默认值是不允许的,如上例函数funcFail所示(无法编译通过)
这是由于在参数声明时,__func__还未被定义。
Good Good Study, Day Day Up.
顺序 选择 循环 总结