C&C++函数指针

今天在阅读libcurl的源码的时候,发现里边定义函数指针的方法,与平时自己所用方式有所不同。详细分析了一下。

libcurl的代码中,定义了一组发送数据的函数指针。如下所示:

//代码目录: lib/urldata.h
struct connectdata {
......
Curl_send *send[2];
......
};

其中,Curl_send定义如下:

//代码目录: lib/urldata.h
/* return the count of bytes sent, or -1 on error */
typedef ssize_t (Curl_send)(struct connectdata *conn, /* connection data */
                            int sockindex,            /* socketindex */
                            const void *buf,          /* data to write */
                            size_t len,               /* max amount to write */
                            CURLcode *err);           /* error to return */

感到疑惑的是,平时我们要使用typedef定义函数指针的话,一般都是写成下面形式:

//定义一个函数指针,所指向函数接收一个整形参数,并返回整形值。
typedef int (*pFunc)(int);

但是,curl_send的定义中,并没有带上指针符号。在查阅一些资料后,发现这样的定义方法也是可以的。

于是,写了下面的程序验证了一下。

#ifdef __cplusplus
#include <iostream>
#else
#include <stdio.h>
#endif

int testFunc(int para) {
#ifdef __cplusplus
    std::cout << "C++ parameter is: " << para << std::endl;
#else
    printf("C parameter is: %d\n", para);
#endif
    return 0;
}

int main() {
    typedef int (pTestFunc)(int);

    pTestFunc* pFunc = testFunc;   //方式1:ok·
    pFunc(1111);                   //方式2:ok
    (*pFunc)(2222);                //方式3:ok

    pTestFunc* pFunc2 = &testFunc; //方式4:ok
    pFunc2(3333);

    return 0;
}

如果将上面程序保存为C程序文件(.c),进行编译,得到下面运行结果:
C parameter is: 1111
C parameter is: 2222
C parameter is: 3333

如果保存为C++程序文件(.cpp),得到运行结果:
C++ parameter is: 1111
C++ parameter is: 2222
C++ parameter is: 3333

从上面结果可以看到:1.采用与curl_send相同的函数声明方式,也是可以的。如上面的pTestFunc的定义。
2.对于函数指针pFunc的初始化,不管采用哪种方式都是可以的。参考上面的方式1与方式4。
3.而对于函数指针pFunc的调用,也可以采用不同的方式,参考方式2与方式3。
4.不管对于C还是C++,这些定义和使用函数指针的方式都是支持的。

当然,我们也可以采用传统的函数指针声明方式,如下程序所示:

int main()
{
	typedef int (*pTestFunc)(int);

	pTestFunc pFunc = testFunc;   //方式5:ok
	pFunc(1111);                  //方式6:ok
	(*pFunc)(2222);               //方式7:ok

	pTestFunc pFunc2 = &testFunc; //方式8:ok
	pFunc2(3333);

	return 0;
}

运行结果与前面所述完全相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值