概述
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);
}
#endif
int 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_2
struct HandleDef {
void (*hw_init)(void);
void (*sys_run)(void);
void (*ie_init)(void);
};
HandleDef handler = {
HW_Init,
Sys_Run,
IE_Init
};
#endif
static 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、运行效果:
更多推荐
单片机-结构体函数指针高级使用方法
发布评论