美文网首页
__func__, __FUNCTION__, __PRETTY

__func__, __FUNCTION__, __PRETTY

作者: yxibng | 来源:发表于2021-12-13 14:29 被阅读0次

    参考: 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 *)
    

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

    相关文章

      网友评论

          本文标题:__func__, __FUNCTION__, __PRETTY

          本文链接:https://www.haomeiwen.com/subject/xovjfrtx.html