我正在使用C,并且我正在尝试通过将2个具有相同签名的函数,第三个具有几乎相同签名但仅少一个参数的函数连接起来,构建一种“复合”函数。函数应按顺序执行,但最终函数必须具有相同的签名。您可以认为它是使用具有相同签名的代码块构建函数(我已经在C ++中通过策略类实现了该功能,但是我正在尝试一种C方法,因为其余的代码已经在C中了。)
为了解释我的方法,我构建了一些非常简单的代码。
#include <stdio.h>
#include <stdlib.h>
typedef void simulFileProc(int a, int b);
typedef void simulRead(int a);
typedef struct compFunct{
simulFileProc* file1;
simulRead* read;
simulFileProc* file2;
} compFunct;
void realProc(int a, int b){
printf("call from realProc %d, %d\n",a,b);
}
void realRead(int a){
printf("call from read %d\n",a);
}
simulFileProc* join(int a, int b, compFunct* func){
void sf(int a, int b){
func->file1(a,b);
printf("intermediate line\n");
func->read(a);
func->file2(a,b);
}
return &sf;
}
int main() {
compFunct* c = malloc(sizeof(256));
c->file1 = &realProc;
c->read = &realRead;
c->file2 = &realProc;
int a=0;
int b=0;
simulFileProc* s = join(a,b,c);
s(4,3);
return 0;
}
它正在工作,但是由于某种原因,仅打印了第一个功能。
call from realProc 4, 3
intermediate line
如果我在“ func-> read(a);”行中添加注释,则表示存在细分错误。
怎么了?有更聪明的方法吗?