围绕结构数组中的功能指针进行讨论。什么是好的做法?

时间:2015-12-31 15:02:31

标签: c struct function-pointers

是否有更简洁的方法在8

中使用函数指针

我真的需要键入定义函数指针吗?我试过但没有收到类型错误。是否存在任何危害,或者我所做的任何违反良好代码实践的事情?

9

3 个答案:

答案 0 :(得分:3)

  

是否有更简洁的方法在结构中使用函数指针?

没有

  

我真的需要键入定义函数指针吗?

不,但它使你的代码更具可读性,因为函数指针的表示法是神秘的。你可以写一下。

typedef struct CALC_TYPE
{
    void (*opt) (int*);
} CALC;
  

是否有任何危害或我做过的任何违反良好代码规范的行为?

不是真的。制作一个只包含一件事的结构是值得怀疑的,但这显然是一种学习练习。

答案 1 :(得分:3)

typedef操作和一些变量是无用的。结构也是但如果我理解你,你想保留它。所以这是一个更加紧凑的方式:

#include <stdio.h>
#include <math.h>
#include <stdlib.h> // calloc

void lineFunc(int* a)
{
   // ...
}

void areaFunc(int* a)
{
   // ...
}

typedef struct CALC_TYPE
{
   void (*opt)(int *a);
} CALC;

int main()
{
   int lineArg[4] = {1 , 2, 3, 4}; //x1, y1, x2, y2
   int areaArg[2] = {5,10};    // base, height

   CALC *cmdArray = calloc(2, sizeof(CALC));

   cmdArray[0].opt = lineFunc;
   cmdArray[1].opt = areaFunc;

   cmdArray[0].opt(lineArg);
   cmdArray[1].opt(areaArg);

   free(cmdArray); // 1 malloc/calloc => 1 free

   return 0;

}

编辑:

  

是否存在任何危险,或者我做过的任何与之相反的危险   代码练习?

  • 包含stdlib.h以使用calloc
  • 不要忘记释放动态分配的内存
  • 为什么pow然后sqrtf然后存储在double?请改用sqrt
  • 你可以避免在这里使用结构

答案 2 :(得分:1)

我在其他答案中没有看到的另外一点 涉及结构使用的好处:函数原型稳定性。即使结构以单个变量开始,结构的未来需求也可能会强制添加更多变量。由于struct变量作为参数传递的方式,在编写使用原始单个单变量struct的函数原型时,在添加其他变量时不会被破坏。

例如,您的结构可以定义为:

typedef struct CALC_TYPE
{
   Operation  opt
} CALC;

或者:

typedef struct CALC_TYPE
{
   Operation  opt       
   int a;
   float b;
} CALC;

不强制更改为调用它的函数。:

void func(CALC *c)
{
    ...
} 

这是一种很好的方法,可以在不更改参数列表的情况下更改需要作为数据传递的项目数。

使用区域功能的修改,考虑以下最初设计用于支持区域测量的结构:

typedef struct
{
    int length;
    int width;
}DIM;

int areaFunc(DIM *d)
{
   return d->length*d->width*d
}

后来对struct支持volume的要求强制添加变量:

typedef struct
{
    int length;
    int width;
    int height;
}DIM;

将新变量添加到结构中不会破坏现有的areaFunc(),但也支持新函数:

int volumeFunc(DIM *d)
{
   return d->length*d->width*d->height;
}