[转]typedef常见用法和函数指针用法

在看如下的代码是有几个知识点不清楚, 这段代码来自关于Qt 之在运行时加载共享库

 
/*QFunctionPointer QLibrary::resolve(const char *symbol)
Returns the address of the exported symbol symbol.
The library is loaded if necessary.
The function returns 0 if the symbol could not be resolved or if the library could not be loaded.
Example:
*/
typedef int (*AvgFunction)(int , int);
 
AvgFunction avg = (AvgFunction) library->resolve("avg");
if(avg)
    return avg(5, 8);
else
    return -1;
 
//The symbol must be exported as a C function from the library.
//This means that the function must be wrapped in an extern "C" if the library is compiled with a C++ compiler. On Windows you must also explicitly export the function from the DLL
//using the __declspec(dllexport) compiler directive, for example:
extern "C" MY_EXPORT int avg(int a, int b)
{
    return (a + b) / 2
}

知识点

1.typedef 在这里的用法。

2.函数指针的使用

3.extern "C"

对于第一点:

tpyedef常见用法:

1.常规变量类型定义
例如:typedef unsigned char uchar
描述:uchar等价于unsigned char类型定义 uchar c声明等于unsigned char c声明

2.数组类型定义
例如: typedef int array[2];
描述: array等价于 int [2]定义; array a声明等价于int a[2]声明

扩展: typedef int array[M][N];
描述: array等价于 int [M][N]定义; array a声明等价于int a[M][N]声明

3.指针类型定义
例如: typedef int *pointer;
描述: pointer等价于 int *定义;pointer p声明等价于int *a声明

例如: typedef int *pointer[M];
描述: pointer等价于 int *[M]定义 pointer p声明等价于int *a[M]声明明

4.函数地址说明
描述:C把函数名字当做函数的首地址来对待,我们可以使用最简单的方法得到函数地址
例如: 函数:int func(void); unsigned long funcAddr=(unsigned long)func, funcAddr的值是func函数的首地址

5.函数声明
例如: typedef int func(void); func等价于 int (void)类型函数
描述1: func f声明等价于 int f(void)声明,用于文件的函数声明
描述2: func *pf声明等价于 int (*pf)(void)声明,用于函数指针的生命,见下一条

6.函数指针
例如: typedef int (*func)(void)
描述: func等价于int (*)(void)类型
func pf等价于int (*pf)(void)声明,pf是一个函数指针变量

7.识别typedef的方法:
a).第一步。使用已知的类型定义替代typdef后面的名称,直到只剩下一个名字不识别为正确
如typedef u32 (*func)(u8);
从上面的定义中找到 typedef __u32 u32;typedef __u8 u8
继续找到 typedef unsigned int __u32;typedef unsigned char __u8;
替代位置名称 typedef unsigned int (*func)(void);
现在只有func属于未知。
b).第二步.未知名字为定义类型,类型为取出名称和typedef的所有部分,如上为
func等价于unsigned unsigned int (*)(unsigned char);
c).第三部.定义一个变量时,变量类型等价于把变量替代未知名字的位置所得到的类型
func f等价于unsigned unsigned int (*f)(unsigned char)

函数指针的使用

从上面的代码中把 int avg(int a, int b)地址赋值给了定义的函数指针。

但是我们可以以另外一种方式来改写上面的代码以如下的代码理解函数指针。

typedef int AvgFunction(int , int);
AvgFunction *avg = NULL;
avg = (AvgFunction*) library->resolve("avg");
if(avg)
    return (*avg)(5, 8);// return avg(5, 8);
else
    return -1;
 
extern "C" MY_EXPORT int avg(int a, int b)
{
    return (a + b) / 2
}

这里对C++函数指针解引用补充说明,如上的注释部分

C++的函数调用很灵活,无论是通过使用函数名本身、指向函数的指针还是函数的引用来调用函数,都既可以用名字本身,也可以解引用语法


---------------------
作者:vex_sx
来源:CSDN
原文:https://blog.csdn.net/yjbaobo/article/details/82734056?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1
版权声明:本文为作者原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值