【问题标题】:Function pointer syntax函数指针语法
【发布时间】:2012-07-04 14:35:36
【问题描述】:

我遇到了两个使用函数指针的不同代码。

请告诉我哪个更好?有什么偏好吗?

typedef int myFunction(int a,int b);
extern myFunction *ptfunction;

typedef int (*ptfunction)(int a,int b);

【问题讨论】:

  • 我会选择第一个,因为第二个无法编译。
  • 这里我不太明白 typedef 的需要。不会简单地声明 int (*ptfunction)(int a,int b);实现和typedef一样?而且我认为简单的声明更清楚。 (如果你不需要它,编译器无论如何都会优化它......)
  • 如果您编辑了原始帖子并添加了两个工作示例,将会很有帮助。

标签: c++ function-pointers typedef


【解决方案1】:

两者都不好,因为它们在语法上不正确。

你需要:

typedef int (*myFunction)(int a, int *b);

【讨论】:

  • 第一个很好(至少在语法上)——你可以定义一个函数类型,你只是不能声明那个类型的对象。
【解决方案2】:

第二个无效;如果您将第一行固定为声明变量而不是类型,则相当于第一行:

int (*ptfunction)(int a, int b);

哪个“更好”完全取决于你想用这些东西做什么。如果你需要多次引用同一个类型,那么typedef会让事情更清楚;如果您只是想像示例中那样声明一个函数指针,那么它只会增加额外的噪音。

(假设在您的第一个示例中,第二个参数应该是int 而不是int*,否则函数调用将无法编译)。

使用函数对象通常更方便、更灵活,尤其是std::function,因为它们可以绑定任意状态。但这超出了这个问题的范围。

【讨论】:

    【解决方案3】:

    不要,使用std::function

    std::function<int (int ,int)> ptfunction;
    ptfunction = f1;
    

    示例(在 c++0x 中的 std 中):

    how to use boost bind

    std::function

    【讨论】:

    • 我喜欢使用std:::function 的建议,但根本不需要std::bind。你可以做ptfunction = f1;
    • 好吧,我不确定你是否可以在没有绑定的情况下做到这一点。
    • 如果你想做更复杂的事情而不是仅仅向前,你只需要绑定。
    【解决方案4】:

    第一个包含另一个错误:您不能将 int 强制转换为指向 int 的指针。哪个更好?它们都完全断章取义。

    【讨论】:

      【解决方案5】:

      对于第一个代码,您必须在某处定义 ptfunction。 而且我认为无法编译第二个代码。

      试试这个:

      typedef int *PTFUNCTION(int, int);
      PTFUNCTION func = f1;
      func(1, 2);
      

      【讨论】:

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