函数指针
问题描述:
typedef struct node{
int term;
struct node *next;
}node;
typedef void(*PTR)(void *);
typedef void(*PTR1)(void *,int,int);
typedef int(*PTR2)(void *,int);
typedef void(*PTR3)(void *,int);
typedef void(*PTR4)(void *,void *,void *);
typedef struct list{
node *front,*rear;
PTR3 INSERT;
PTR *MANY;
PTR DISPLAY,SORT,READ;
PTR4 MERGE;
}list;
void constructor(list **S)
{
(*S)=calloc(1,sizeof(list));
(*S)->front=(*S)->rear=NULL;
(*S)->INSERT=push_with_value;
(*S)->READ=read;
(*S)->SORT=sort;
(*S)->DISPLAY=display;
(*S)->MERGE=merger;
(*S)->MANY=calloc(2,sizeof(PTR));
(*S)->MANY[1]=read;
}
int main()
{
list *S1,*S2,*S3;
constructor(&S1);
constructor(&S2);
constructor(&S3);
S1->MANY[1](S1);
S1->SORT(S1);
S1->DISPLAY(S1);
return 0;
}
在所有这些函数的参数void *
被强制转换为list *
在函数内。 有什么方法可以通过将MANY[1]
更改为READ_IT;
之类的其他名称来呼叫S1->READIT;
?函数指针
我打算创建一个通用的头文件,以便我可以将它用于我的所有程序。 由于我不知道我需要多少个函数指针,我打算创建每个函数指针类型的动态数组。
答
typedef struct list{
node *front,*rear;
PTR3 INSERT;
PTR READIT;
PTR DISPLAY,SORT,READ;
PTR4 MERGE;
}list;
...
(*S)->READIT = read;
...
S1->READIT(S1);
那些所有帽子变量名都非常累人。 – 2013-03-24 18:23:52
对于函数和变量,良好的命名约定是'UpperCamelCase'类型和'lowerCamelCase'。但更重要的是,一旦你决定遵循一些约定,你应该保持这种方式。 – LihO 2013-03-24 18:26:03
感谢您的建议......我将在未来的编码中牢记这一点:) – 2013-03-24 18:26:57