__func__, __FUNCTION__, __PRETTY

2021-12-13  本文已影响0人  yxibng

参考: 6.50 Function Names as Strings

GCC 提供了三种方法去获取当前调用函数的名字

__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 *)

结论:尽量使用 __PRETTY_FUNCTION__ 可以打印完整的方法签名,无论是调试还是记录log都很有用

上一篇下一篇

猜你喜欢

热点阅读