参考: 6.50 Function Names as Strings
GCC 提供了三种方法去获取当前调用函数的名字
__func__
__FUNCTION__
__PRETTY_FUNCTION__
__func__
是C99标准的一部分
static const char __func__[] = "function-name";
__FUNCTION__
跟_ func _
效果一样,只是为了兼容旧版的GCC
__PRETTY_FUNCTION__
在 c + + 中,__PRETTY_FUNCTION__
既包含函数的签名,也包含函数的名称。
效果
定义C函数,C++ 类成员函数,打印相应的结果
static int func(int a, void *b) {
NSLog(@"__fun__ = %s",__func__);
NSLog(@"__FUNCTION__ = %s",__FUNCTION__);
NSLog(@"__PRETTY_FUNCTION__ = %s",__PRETTY_FUNCTION__);
return 0;
}
namespace ts {
class A {
public:
int func(int a, void *b) {
NSLog(@"__fun__ = %s",__func__);
NSLog(@"__FUNCTION__ = %s",__FUNCTION__);
NSLog(@"__PRETTY_FUNCTION__ = %s",__PRETTY_FUNCTION__);
return 0;
}
};
};
在Objective-C++ 中调用
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"------------IN Objective-C------------");
NSLog(@"__fun__ = %s",__func__);
NSLog(@"__FUNCTION__ = %s",__FUNCTION__);
NSLog(@"__PRETTY_FUNCTION__ = %s",__PRETTY_FUNCTION__);
NSLog(@"------------IN C function------------");
func(1, nil);
NSLog(@"------------IN C++------------");
ts::A().func(1, nil);
}
输出结果如下:
------------IN Objective-C------------
__fun__ = -[ViewController viewDidLoad]
__FUNCTION__ = -[ViewController viewDidLoad]
__PRETTY_FUNCTION__ = -[ViewController viewDidLoad]
------------IN C function------------
__fun__ = func
__FUNCTION__ = func
__PRETTY_FUNCTION__ = int func(int, void *)
------------IN C++------------
__fun__ = func
__FUNCTION__ = func
__PRETTY_FUNCTION__ = int ts::A::func(int, void *)
网友评论