概述

       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、运行效果:

更多推荐

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