zoukankan      html  css  js  c++  java
  • 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.

    顺序 选择 循环 总结

  • 相关阅读:
    经济--股票--深圳指数基金
    经济--年终奖理财攻略
    经济--股票--基金经理打死不肯说的赚钱黑幕
    经济--股票--基金定投
    经济--股票--基金分类的三个角度
    经济学--股票--必胜法则
    经济--降息对股市是好消息还是坏消息?
    PHP数组的排序函数
    使用回调函数处理数组的函数
    统计数组元素的个数和唯一性的函数
  • 原文地址:https://www.cnblogs.com/Braveliu/p/12217270.html
Copyright © 2011-2022 走看看