打印

让我很晕乎的函数定义

[复制链接]
1858|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
因特网用户|  楼主 | 2009-9-20 20:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.对于函数指针的定义一直比较晕
常见的办法是通过typedef定义一个指向某种函数的指针类型
如typedef int(* Func)(int,int); 然后就可以通过Func定义一个指向int funcname(int,int)的函数了,如 Func pAdd=Add;(Add为一个int funcname(int,int)类型函数)
不过对于不用typedef的情况如何像Func pAdd=Add定义函数指针类型呢????
好像用#define比较难办到啊,像#define unsinged int Uint16这样子
似乎只能这样了 #define Func(pFunc)  int(* pFunc)(int,int)了
通过Func(pAdd)来定义变量来,这样子看起来像函数调用了,不怎么好,给我大大有什么好的办法呢
2.看看这个让人头痛的定义,各位知道是定义什么吗
int (*Register (int (*pf)(const char *, const char *))) (const char *, const char *);

3.
typedef int (*FP_CALC)(int, int);
FP_CALC calc_func(char op);
int (*s_calc_func(char op)) (int, int)
{
    return calc_func(op);
}
大家看这句,int (*s_calc_func(char op)) (int, int)该怎么理解呢,这个函数是怎么定义的,从函数实现来看,该函数返回值是一个函数指针,即FP_CALC类型的函数指针,而这个函数指针指向的是int (*FuncName)(int, int)类型的函数,int (*s_calc_func(char op)) (int, int)这句让我很困惑啊

相关帖子

沙发
因特网用户|  楼主 | 2009-9-20 20:23 | 只看该作者
问题3对应的源代码,vc6.0下面调试通过

int calc(int a, int b, char op);                               
FP_CALC calc_func(char op);                                       
int add(int, int);                       
int sub(int, int);
int mul(int, int);
int div(int, int);

int (*s_calc_func(char op))(int, int);


int add(int a, int b)
{
    return a + b;
}

int sub(int a, int b)
{
    return a - b;
}

int mul(int a, int b)
{
    return a * b;
}

int div(int a, int b)
{
    return b? a/b : -1;
}


int calc(int a, int b, char op)
{
    FP_CALC fp = calc_func(op);  

    int (*s_fp)(int, int) = s_calc_func(op);

    if (fp) return fp(a, b);

    else return -1;
}






FP_CALC calc_func(char op)  

{
    switch (op)
    {
    case '+': return  (FP_CALC )add;
    case '-': return  (FP_CALC )sub;
        case '*': return (FP_CALC )mul;
        case '/': return (FP_CALC )div;
    default:
        return NULL;
    }
    return NULL;
}


int (*s_calc_func(char op)) (int, int)
{
    return calc_func(op);
}


void main()



{



    int a = 100, b = 20;



    printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));



    printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));



    printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));



    printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));



}

使用特权

评论回复
板凳
wanghao123| | 2009-9-20 21:09 | 只看该作者
谢谢楼主,
我对这个也很迷惑,呵呵 学习了

使用特权

评论回复
地板
lover9| | 2009-9-21 11:16 | 只看该作者
我也搞不清楚啊

使用特权

评论回复
5
HWM| | 2009-9-21 12:07 | 只看该作者
没事尽量别去碰那些“悔涩”的东西,这些东西只有当你确实需要用它时(自然也就明白为何会如此),才会更深切的理解其中的奥秘。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

161

主题

1040

帖子

0

粉丝