如何移除C语言结构体中函数指针的typedef并改写代码?
函数指针typedef的等价写法及移除后的代码示例
首先直接回答你的问题:typedef int ( *ptrToFunc ) ( int a, int b ); 本质是给指向返回值为int、参数为两个int类型的函数的指针这个复杂类型,起了一个简洁的别名ptrToFunc。
换句话说,ptrToFunc就是int (*)(int, int)这个函数指针类型的“外号”,你可以用ptrToFunc来声明这种类型的变量,就像用int声明整数变量一样。
移除所有typedef后的完整代码
如果要把代码里的typedef全部去掉,直接用原始类型替换即可,修改后的代码如下:
/**************************************************************** * 用结构体中保存的函数指针调用函数 * * * * 运行结果: * * Add: 8 * * Mult: 15 * ****************************************************************/ #include "allheaders.h" // 自定义头文件 // #include <stdio.h> // 通用头文件,没有上面的就用这个 // 移除函数指针的typedef,直接用原始类型定义结构体 struct data { int result; // 存储计算结果 int (*pFunc)(int a, int b); // 直接声明函数指针成员,类型就是int(*)(int,int) }; int Add ( int a, int b ) { // 加法函数 return a + b; } int Multi ( int a, int b ) { // 乘法函数 return a * b; } int main ( int argc, char *argv[] ) { struct data stRecord; // 移除结构体typedef后,声明变量要加struct前缀 // 给结构体里的函数指针赋值并调用 stRecord.pFunc = Add; // 让指针指向Add函数 stRecord.result = stRecord.pFunc ( 5, 3 ); // 通过指针调用函数,保存结果 printf ( " Add: %d\n", stRecord.result ); stRecord.pFunc = Multi; // 让指针指向Multi函数 stRecord.result = stRecord.pFunc ( 5, 3 ); // 调用乘法函数 printf ( " Mult: %d\n", stRecord.result ); return 0; }
关键修改点说明
- 移除函数指针typedef:把结构体里的
ptrToFunc pFunc;直接替换成int (*pFunc)(int a, int b);,这里的(*pFunc)表示这是一个函数指针变量,后面的(int a, int b)是函数参数类型,前面的int是函数返回值类型。 - 移除结构体typedef:把原代码的
typedef struct data {...} stData;改成struct data {...};,声明变量时就要写成struct data stRecord;,而不是原来的stData stRecord;。
你之前尝试用普通int*指针赋值失败,是因为int*是指向整数的指针,和指向函数的指针完全是两种不同类型,不能混用——函数指针的类型必须和它指向的函数的返回值、参数列表完全匹配。
内容的提问来源于stack exchange,提问作者user3859005
相关产品推荐
相关产品推荐

