如何让函数指针能指向任意函数?如何保存可变参数?
如题,先看下面的示例代码:
- C/C++ code
#include<stdio.h>int max(int x,int y) /* 声明一个函数 */{ return(x > y ? x : y); } void main() { int (*ptr)(int, int);/* 声明一个函数指针 */ int a,b,c; ptr = max;/* 将func函数的首地址赋给指针f */ scanf("%d%d",&a,&b); c=(*ptr)(a,b); printf("a=%d,b=%d,max=%d",a,b,c);}
请问,如何让任何函数都能赋值给同一个函数指针?
也就是说,让这个函数指针能像printf函数那样,支持任意数量,多种类型的参数。
还有,如何保存这N个参数,等需要用函数指针时,将保存的参数作为调用函数指针指向的函数所传递的参数?
比如要实现这样的代码:
- C/C++ code
int a(int n, char *s){ //省略代码}int b(char *in, char *out, int n){ //省略代码}int main(){ char str[100], ss[200]; int n, m; int (*ptr_a)(XXXXXX), (*ptr_b)(XXXXXX);/* 如何声明这两个函数指针? */ /* save_func函数支持不定参数,并且能保存这些参 * 数,等调用run_func函数时,就会调用函数指针 * 指向的函数,并将保存的这些参数传给这个函数 */ save_func( ptr_a, a, n, str); save_func( ptr_b, b, str, ss, m); run_func(ptr_a); run_func(ptr_b);}
run_func函数和save_func函数该如何写?
[解决办法]
三个字:办不到
[解决办法]
可能有其他巧妙的方法
但想像你说的这么智能,c语言真心办不到
[解决办法]
用void指针
[解决办法]
- C/C++ code
/*LZ所说的,实在没想好.. 下面是用共同体写的,算是一个思路吧, 当将某个函数赋值给共同体中的一个函数指针成员后,就可以通过共同体中 其他与函数参数相同的函数名调用*/#include <iostream>using namespace std;void Show(){ cout<<"Show()"<<endl;}void Add(int a, int b){ cout<<"a + b = "<<a + b<<endl;}void PrintStr(char* ch){ cout<<ch<<endl;}typedef void (*PShow)(void);typedef void (*PAdd)(int a, int b);typedef void (*PPrintStr)(char *ch);union FunPtr{ PShow fun1; PAdd fun2; PPrintStr fun3;};int main(int argc, char* argv[]){ int a = 3; int b = 4; char* str = "Hello World!"; FunPtr fun; fun.fun1 = (PShow)Show; fun.fun1(); fun.fun1 = (PShow)Add; fun.fun2(a, b); fun.fun1 = (PShow)PrintStr; fun.fun3(str); system("pause"); return 0;}
[解决办法]
[解决办法]
参数都不确定怎么知道该用什么?根本不存在这种需求。可以把函数都通过一个相同参数的函数封装起来再调用。
[解决办法]
我也不会!
[解决办法]
用结构体的话转换也需要参数的类型,不知道参数怎么转,联合可能还管用,但是有意义吗
[解决办法]
可以,但是没有意义。怎么知道该传什么类型的结构体。如果你知道该传什么类型的结构体,那么说明你也可以明确地知道应该调用哪个类型函数。这样直接调用不就行了,为啥多此一举用指针?函数指针一般是为运行时多态或者代码重用,没需求应该避免。
------解决方案--------------------
lz 为何有如此需要
目前c 标准中没有,说明 :
1。 太难,办不到
2。有别的解决办法,没必要
[解决办法]
[解决办法]
Qt我刚刚学了几天。connect的信号和槽都是通过一个宏来生成的。具体原理我还没研究。但是应该用到了C 的编译期多态,个人觉得c语言是无法模仿的编译期多态的。
你说按键问题,每个合法键盘输入都对应一个键盘消息。你应该考虑模仿windows的回调函数(参数固定)。而不是Qt