【问题标题】:C++ function pointer syntaxC++ 函数指针语法
【发布时间】:2011-04-05 16:21:13
【问题描述】:

我知道一般来说,函数指针是这样声明的:

 void __stdcall my_func(int i) {} // for assigning

 void (__stdcall * my_ptr)(int) = &my_func;

现在我有几个以函数指针作为参数的函数:

 void calling_func(void (__stdcall * callback)(int)) { *callback(1); }

在头文件中,我只是把东西的名字去掉了:

void calling_func(void (__stdcall *)(int));

瞧,这行得通……让我开始思考:如果这是一个完整的类型声明,难道不能将普通的TYPE NAME = VALUE 语法也用于函数指针吗?

我试图声明:

 ( void (__stdcall *)(int) ) callback = &my_func;

它也可以编译!为什么不经常使用这个?这个符号有缺陷吗?对我来说,它似乎会极大地简化函数指针的使用......也在typedefs中,例如:通常它是typedef OLDNAME NEWNAME,只是使用函数指针,这是一种奇怪的由内而外的语法,其中新名称实际上位于中间的整个表达式。更不用说返回函数指针的函数的符号了......

【问题讨论】:

    标签: c++ syntax function-pointers


    【解决方案1】:

    这不是声明,它是 callback 的转换,然后分配给它。

    您确定在范围内没有预先存在的声明吗?

    【讨论】:

    • 好地方。我不知道他在那里做什么!
    【解决方案2】:

    不适合我。 AFAIK 它不是有效的 C++。

    不过,你可以伪造它!

    template <typename T>
    struct identity {
       typedef T type;
    };
    
    identity<void(*)(int)>::type callback = &my_func;
    

    或者使用boost::function(或std::function)之类的东西来获得最终的胜利。

    【讨论】:

      【解决方案3】:

      我更喜欢 typedefing 我的函数指针,并且还没有遇到问题。

      Typedef,如果我理解正确的话,与其说是创建一个新类型,不如说是另一个类型的别名(这就是为什么size_tunsigned int 可以互换使用而不会引起编译器投诉,例如)。因此,对于您经常使用的函数指针类型,typedef 使它们更易于使用。

      对于函数指针类型定义,语法如下:

      typedef IObject *    (*CreateFunc )(int, Core *);
      

      在内部使用所需的类型名称(与您现在所做的没有太大区别)。您可以指定大多数函数修饰符(__stdcall、__declspec 等),它们位于 * name 之前的括号内。

      您可以很容易地调用、分配和获取这些值,以及将它们转换为void * 以供传递(当类型未知时)。

      【讨论】:

        猜你喜欢
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        相关资源
        最近更新 更多