功能指针是否模拟C中有害的方法?

时间:2014-12-11 03:10:17

标签: c methods function-pointers

我知道我可以在C中使用函数指针来模拟这样的方法:

typedef struct a
{
    int x, y;
    int (*add)(int x, int y);
}a;

int add(int x, int y)
{
    return x + y;
}

int main()
{
    a b = {2, 3, &add};
    printf("%d\n", b.add(b.x, b.y));
    return 0;
}

然而,在C中这种不好的形式?我应该找到其他方法吗?如果这很糟糕,我应该做什么而不是这个?显然,当我使用它时,它不会像在这个例子中那样简单。

2 个答案:

答案 0 :(得分:2)

不错C; Linux充满了这样的代码

目前还不清楚这种风格是否能为你带来任何价值,从而留下个人品味,审美等方面的答案。

但有一件事我想提一下:如果你真的想模拟方法,你必须从模仿'this'指针开始。这就是方法(或一般的封装)的全部内容 - 它们可以访问结构的内部。

因此,您的代码应如下:

typedef struct a
{
    int x, y;
    int (*add)(struct a* this, int x, int y);
} a;

printf("%d\n", b.add(&b, b.x, b.y));

答案 1 :(得分:-1)

这在我的gcc 4.4.7中运行良好,在linux内核源代码中,有很多情况用这种方式编写。像file_operations,inode_operations等。它与策略模式和一些面向对象的编程思想相结合。 所以,我认为它在C中并不坏,我认为唯一的缺点是你可以这样写:

a b = {.x=2, .y=3, .add=add}; 

这更具可读性和风格。