是否有更简洁的方法在8
?
我真的需要键入定义函数指针吗?我试过但没有收到类型错误。是否存在任何危害,或者我所做的任何违反良好代码实践的事情?
9
答案 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;
}
编辑:
是否存在任何危险,或者我做过的任何与之相反的危险 代码练习?
答案 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;
}