C语言模拟虚基类 - 模拟lighttpd fdevent实现

2024-04-26 09:38

本文主要是介绍C语言模拟虚基类 - 模拟lighttpd fdevent实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看了lighttpd中的fdevent的实现过程有些巧妙,写个例子模拟它的的实现:

虚基类是fdos(os操作系统,fd是随便加的没什么意义),它有三个派生类分别是:windows, linux, mac,

它们的都有的public方法是:open, close, playgame。

/// fdos.h#ifndef FDOS_H_INCLUDED
#define FDOS_H_INCLUDEDtypedef enum
{OS_UNSET = -1,OS_WINDOWS,OS_LINUX,OS_MAC
}fd_type;typedef struct fdos
{fd_type type;int maxfds;int (*open)(struct fdos *os);void (*close)(struct fdos *os);void (*playgame)(struct fdos *os, char *name);
}fdos;// public
fdos* fdos_init(fd_type type, int maxfds);
void fdos_free(fdos *os);int fdos_open(fdos *os);
void fdos_close(fdos *os);
void fdos_playgame(fdos *os, char *name);// private
int fdos_windows_init(fdos *os);
int fdos_linux_init(fdos *os);
int fdos_mac_init(fdos *os);#endif // FDOS_H_INCLUDED

/// fdos.cpp#include "fdos.h"
#include <stdio.h>
#include <stdlib.h>fdos* fdos_init(fd_type type, int maxfds)
{fdos *os;os = (fdos*)malloc(sizeof(*os));os->maxfds = maxfds;switch (type){case OS_WINDOWS:if (0 != fdos_windows_init(os)){printf("windows init fail\n");return NULL;}return os;case OS_LINUX:if (0 != fdos_linux_init(os)){printf("linux init fail\n");return NULL;}return os;case OS_MAC:if (0 != fdos_mac_init(os)){printf("mac init fail\n");return NULL;}return os;case OS_UNSET:break;}printf("fdos init fail\n");return NULL;
}void fdos_free(fdos *os)
{if (os){free(os);}
}int fdos_open(fdos *os)
{return os->open(os);
}void fdos_close(fdos *os)
{return os->close(os);
}void fdos_playgame(fdos *os, char *name)
{return os->playgame(os, name);
}

/// fdwindows.cpp#include "fdos.h"
#include <stdio.h>static int fdos_windows_open(fdos *os)
{printf("windows open\n");return 0;
}static void fdos_windows_close(fdos *os)
{printf("windows close\n");
}static void fdos_windows_playgame(fdos *os, char *name)
{printf("windows playgame: %s\n", name);
}int fdos_windows_init(fdos *os)
{os->type = OS_WINDOWS;// x作为宏参数,##x则表示连接宏参数// 如果是#x, 则表示是一个字符串,如:// #define MY_CONST(x) #x// printf("%s", MY_CONST(hello));// 输出:hello
#define SET(x) \os->x = fdos_windows_##x;// 相当于:fdos_windows_openSET(open);// 相当于:fdos_windows_closeSET(close);// 相当于:fdos_windows_playgameSET(playgame);return 0;
}

/// fdlinux.cpp#include "fdos.h"
#include <stdio.h>static int fdos_linux_open(fdos *os)
{printf("linux open\n");return 0;
}static void fdos_linux_close(fdos *os)
{printf("linux close\n");
}static void fdos_linux_playgame(fdos *os, char *name)
{printf("linux playgame: %s\n", name);
}int fdos_linux_init(fdos *os)
{os->type = OS_LINUX;
#define SET(x) \os->x = fdos_linux_##x;SET(open);SET(close);SET(playgame);return 0;
}

/// fdmac.cpp#include "fdos.h"
#include <stdio.h>static int fdos_mac_open(fdos *os)
{printf("mac open\n");return 0;
}static void fdos_mac_close(fdos *os)
{printf("mac close\n");
}static void fdos_mac_playgame(fdos *os, char *name)
{printf("mac playgame: %s\n", name);
}int fdos_mac_init(fdos *os)
{os->type = OS_MAC;
#define SET(x) \os->x = fdos_mac_##x;SET(open);SET(close);SET(playgame);return 0;
}

/// main.cpp#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "fdos.h"/// test
int main(void)
{fdos *os = fdos_init(OS_WINDOWS, 3);fdos_open(os);fdos_playgame(os, "wow");fdos_close(os);fdos_free(os);os = fdos_init(OS_LINUX, 3);fdos_open(os);fdos_free(os);os = fdos_init(OS_MAC, 3);fdos_playgame(os, "zx");fdos_free(os);return 0;
}


这篇关于C语言模拟虚基类 - 模拟lighttpd fdevent实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/937232

相关文章

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3