概述

C语言结构体对函数指针封装示例(面向对象思想写法)

案例1:

1、示例:

#include <stdio.h>#define FUN_1 0U //方法1:
#define FUN_2 0U    //方法2:
#define FUN_3 1U    //方法3:int i, j;struct DATE{int year;char month;char data;char hour;char min;char sec;
};
struct DATE date;struct str_func {int a;int b;void (*myPrintf)(void);void (*init_value)(void);void (*date_func)(void);
};void myPrintf(void) {printf("C语言结构体对函数指针封装示例 \r\n");
}void init_value(void) {i = 10;j = 20;
}void date_func(void)
{date.year = 2020;date.month = 03;date.data = 30;date.hour = 18;date.min = 01;date.sec = 25;
}//方法1:
#if FUN_1
struct str_func t_func = {.a = 5,.b = 6,.myPrintf = myPrintf,.init_value = init_value,.date_func = date_func,
};staic void fun(void)
{if (t_func.myPrintf){t_func.myPrintf();}if (t_func.init_value){t_func.init_value();printf("i=%d,j=%d \r\n", i, j);}if(t_func.date_func){t_func.date_func();printf("year:%d, month:%d, data:%d, hour:%d, min:%d, sec:%d \r\n",date.year,date.month,date.data,date.hour,date.min,date.sec);}
}
#endif
*///方法2:
#if FUN_2
void fun(void)
{struct str_func t_func = {.a = 5,.b = 6,.myPrintf = myPrintf,.init_value = init_value,.date_func = date_func,};t_func.myPrintf();t_func.init_value();printf("i=%d,j=%d \r\n", i, j);t_func.date_func();printf("year:%d, month:%d, data:%d, hour:%d, min:%d, sec:%d \r\n",date.year,date.month,date.data,date.hour,date.min,date.sec);
}
#endif//方法3:
#if FUN_3
struct str_func t_func;void fun(void)
{t_func.a = 5,t_func.b = 6,t_func.myPrintf = myPrintf,t_func.init_value = init_value,t_func.date_func = date_func,t_func.myPrintf();t_func.init_value();printf("i=%d,j=%d \r\n", i, j);t_func.date_func();printf("year:%d, month:%d, data:%d, hour:%d, min:%d, sec:%d \r\n",date.year,date.month,date.data,date.hour,date.min,date.sec);
}
#endifint main() {fun();    return 0;
}

2、运行结果:

案例2:

1、示例:(注:使用visual Studio2019编写)

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>static void HW_Init(void);  //硬件初始化
static void Sys_Run(void);  //系统运行
static void IE_Init(void);  //中断初始化#define FUN_1  1u
#define FUN_2  0u#if FUN_1
typedef struct _HandleDef {void (*hw_init)(void);void (*sys_run)(void);void (*ie_init)(void);
}HandleDef;
#endif#if FUN_1// C++语言环境(在单片机上验证未通过)也有可能是编译器的问题,现在没时间去深究它,往后有时间深入研究看看。
HandleDef handler = {handler.hw_init = HW_Init,handler.sys_run = Sys_Run,handler.ie_init = IE_Init
};// C语言环境(在单片机上验证通过)
//HandleDef handler = {
//    .hw_init = HW_Init,
//    .sys_run = Sys_Run,
//    .ie_init = IE_Init
//};
#endif#if FUN_2struct HandleDef {void (*hw_init)(void);void (*sys_run)(void);void (*ie_init)(void);
};HandleDef handler = {HW_Init,Sys_Run,IE_Init
};
#endifstatic void HW_Init(void)
{std::cout << "HW_Init !\n";
}
static void Sys_Run(void)
{std::cout << "Sys_Run !\n";
}static void IE_Init(void)
{std::cout << "IE_Init !\n";
}int main()
{handler.hw_init();handler.ie_init();handler.sys_run();
}// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单// 入门使用技巧:
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

2、运行效果:

visual studio2019示例:a

案例3:

1、示例代码(IDE: cLion)

#include<stdio.h>
#include<stdlib.h>typedef int (*Operation)(int a, int b);typedef struct {int (*fun1)(int a, int b);void (*fun2)(int a, int b);Operation add; // 函数指针Operation sub; // 函数指针
}HandleDef;static int FUN1(int a, int b)
{printf("FUN1 ! a/b=%d\n", a / b);return a / b;
}
static void FUN2(int a, int b)
{printf("FUN2 ! a*b=%d\n", a * b);
}static int ADD(int a, int b)
{printf("ADD ! a+b=%d\n", a + b);return a + b;
}static int SUB(int a, int b)
{printf("SUB ! a-b=%d\n", a - b);return a - b;
}HandleDef handler = {ADD,SUB,FUN1,FUN2,
};int main()
{handler.fun1(22, 10);handler.fun2(2, 10);handler.add(3, 1);handler.sub(3, 1);return 0;
}

2、运行效果:

单片机-结构体函数指针高级使用方法相关推荐

  1. c 结构体 函数 指针

    #include "stdio.h" struct DEMO { int x,y; int (*func)(int,int); //函数指针 }; int add2(int x,i ...

  2. C语言函数指针(结构体函数指针)

    文章目录 20211126 这篇讲得好 参考文章1:C语言函数指针(指向函数的指针)详解 函数指针的定义形式: returnType (*pointerName)(param list); 示例代码: ...

  3. C语言结构体函数指针

    #include <stdio.h> #include <malloc.h> typedef struct Value //只有结构体变量才分配地址,而结构体的定义是不分配空间 ...

  4. 结构体自定义指针函数c语言,C语言结构体中的函数指针

    C语言结构体中的函数指针 C语言结构体中的函数指针内容由小编收集整理,希望对您的 学习有所帮助!更多内容请关注应届毕业生考试网! 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准 ...

  5. JNA实战笔记汇总(二)——JNA和C / C ++的数据类型映射(dll函数回调、结构体、指针)

    目录 JNA技术难点 1.函数回调 2.结构体 3.指针 JNA技术难点 有过跨平台.跨语言开发的程序员都知道,跨平台.预研调用的难点,就是不同语言之间数据类型不一致造成的问题.绝大部分跨平台调用的失 ...

  6. c语言 返回函数是结构体指针变量,一个函数返回值为指向结构体的指针的问题...

    一个函数返回值为指向结构体的指针的问题 #include #include struct student { int num; char name[10]; struct student *next; ...

  7. C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)

    文章目录 C语言项目实战:24点游戏计算器(基于结构体.指针.函数.数组.循环等知识点) 前言:24点游戏计算器的规则如下 一.项目的创建标 1.选择项目 2.输入项目名称和路径 3.创建头文件Mai ...

  8. C 语言结构体数组指针以及函数

    结构体数组指针 指针变量可以指向一个结构体数组,这时指针变量的值是整个数组的首地址. 设 ps 为指向结构体数组的指针变量,则 ps 也指向该结构体数组的第 0个元素,ps+1 指向第一个元素,ps+ ...

  9. C++中的结构体函数(一)

      本文建议在看完"C++中的数组函数"后食用.   结构体在某种程度上与数组有一定的相似性,就是能够包含较多的元素.不过结构体与数组相比起来,其整体性更强.整体性强的表现主要体现 ...

最新文章

  1. HTML5的学习,各个标签的尝试
  2. java util concurrent_Error: java.util.concurrent.Execution
  3. 【转载】C++操作符
  4. qt文件选择控件_Qt编写的项目作品2-控件属性设计器(组态)
  5. CSS 实现隐藏滚动条同时又可以滚动
  6. PHP字符串offset取值特性
  7. 批处理-延迟环境变量扩展
  8. 您试图打开的项目是WEB项目,需要通过指定其Url路径来打开它
  9. cad常青藤插件_做CAD设计,别说你不知道,这些插件有多好用
  10. 学习数据库的概念,作用
  11. Mac上编译mingw
  12. 利用php curl暴力破解urp账号密码
  13. 2019年成功与失败的危机公关案例分析
  14. Mac安装redis并设置开机自启动
  15. 计算机硕士研究生论文格式,计算机硕士论文格式
  16. 2022电赛C题:小车跟踪(方案1+核心代码)
  17. 一、什么是JavaWeb?
  18. 生成linux命令,详解Linux下随机生成密码的命令总结
  19. 七夕小案例:用代码给心爱的她画一个爱心
  20. 韩国美女的16种味道

热门文章

  1. 4.网络配置与系统管理
  2. 分享一个转换pdf,PDF分割、指定页提取无需安装软件的方法
  3. C++OpenCV系统学习(17)——图像分割与抠图(4)Grabcut
  4. 文章详情页----- 详细步骤
  5. 长尾理论读书笔记:第一章 长尾市场
  6. 2020京东春招笔试题目
  7. Pandas批量拆分Excel与合并Excel
  8. java中BitSet详解
  9. 按位取反‘~’是啥?
  10. 传统企业培训与线上直播培训大PK