前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面向对象的C语言

面向对象的C语言

作者头像
杜金房
发布于 2020-12-21 08:17:35
发布于 2020-12-21 08:17:35
71000
代码可运行
举报
运行总次数:0
代码可运行

大家在学C、C++ 的时候,老师多半会讲过:C语言是面向过程的编程语言,C++是面向对象的编程语言。但归根结底,面向过程还是面向对象,这是编程思想的差异,而不是语言的差异。笔者最近在看baresip源码,C语言也能写成面向对象。

笔者,想了个应用场景,写了个简单的demo。笔者当年的第一份工作,维护BPLA(北洋打印机指令集)SDK,其中重要的一项工作是,通过串口、并口、usb、网络等软硬件接口,发送控制指令。

笔者先创建了一个interface.h文件,相当于C++里的虚类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

typedef void (* p_func_connect) ();
typedef void (* p_func_send_cmd) (char *);
typedef void (* p_func_disconnect) ();

struct interface
{    
    char *name;
   p_func_connect connect;
   p_func_disconnect disconnect;
   p_func_send_cmd send_cmd;
};

然后创建modules文件,并在此文件夹下,创建了usb.ccom.cdriver.cnetwork.c,分别对应USB、串口、驱动接口、网络接口的实现。相当于C++中,继承虚类的各个子类实现。usb.c如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

#include "../interface.h"
static void connect() {
    printf("connect by usb\n");
}

static void disconnect() {
    printf("disconnect by usb\n");
}

static void send_cmd(char *cmd) {
    printf("send cmd by usb: %s\n", cmd);
}

const struct interface usb = {    "usb",
   connect,
   disconnect,
   send_cmd
};

为了让这些“类”用起来更优雅些,笔者在interface.hinterface.c中添加了find_device函数,添加了static.c

interface.c文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

#include "interface.h"

extern const struct interface *interfaces[];

const struct interface * find_device(char *name) {
    int i = 0;    
    struct interface *dev = interfaces[0];    
    
    for (; dev; i++) {
        if (0 == strcmp(name, dev->name)) {
            break;
       }       dev = interfaces[i + 1];
            
   }
    
     return dev;
}
     

static.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

#include <stdio.h>
#include "interface.h"

extern const struct interface com;
extern const struct interface usb;
extern const struct interface driver;
extern const struct interface network;

const struct interface *interfaces[] = {
   &com,
   &usb,
   &driver,
   &network,
   NULL };

static.c进阶版,Makefile文件动态生成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

MODULES:=$(wildcard ./modules/*.c)
MODULES:=$(patsubst ./modules/%.c, %, $(MODULES))static.c:
   echo "#include <stdio.h>" > $@
   echo "#include \"interface.h\"\n" >> $@    
    for n in $(MODULES); do \
       echo "extern const struct interface $${n};"  >> $@  ; \
   done
   echo "" >> $@
   echo "const struct interface *interfaces[] = {" >> $@    
    for n in $(MODULES); do \
       echo "  &$${n},"  >> $@  ; \
   done
   echo "  NULL };" >> $@

也可根据实际情况,动态设置使用哪些module,如,现在使用的打印机只有usb口和网口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

MODULES:=usb network

最后贴下main.c文件和调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

#include <stdio.h>
#include <stdlib.h>
#include "interface.h"

int main() {
    struct interface *dev = NULL;    
    char name[255];    
    
    while (1) {
        memset(name, 0, 255);
       gets(name);       dev = find_device(name);        
        if (dev) {
           dev->connect();
           dev->send_cmd("print hello world");
           dev->disconnect();
       } else {          
            printf("no such device: %s!\n", name);
       }
   }    
             
     return 0;
}
     

运行如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

➜  communication ./main
warning: this program uses gets(), which is unsafe.
usb
connect by usb
send cmd by usb: print hello world
disconnect by usb
network
connect by network
send cmd by network: print hello world
disconnect by network

附:

Makefile文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

MODULES:=$(wildcard ./modules/*.c)
MODULES:=$(patsubst ./modules/%.c, %, $(MODULES))

SRC:=$(wildcard *.c)
SRC+=$(patsubst %, modules/%.c, $(MODULES))

OBJ:=$(patsubst %.c, %.o, $(SRC))
CC:=gcc -fPIC

all: static.c $(OBJ)
   $(CC) $(OBJ) -o mainstatic.c:
   echo "#include <stdio.h>" > $@
   echo "#include \"interface.h\"\n" >> $@    
    for n in $(MODULES); do \
       echo "extern const struct interface $${n};"  >> $@  ; \
   done
   echo "" >> $@
   echo "const struct interface *interfaces[] = {" >> $@   
    for n in $(MODULES); do \
       echo "  &$${n},"  >> $@  ; \
   done
   echo "  NULL };" >> $@%o:%c
   $(CC) $(CFLAGS) -c $< -o $@

clean:
   rm *.o
   rm ./modules/*.o
   rm main
   rm static.c
    
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeSWITCH中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
InfoQ 2025 年趋势报告:软件架构和设计
作者 | Thomas Betts, Sarah Wells, Eran Stiller, Daniel Bryant
深度学习与Python
2025/05/15
1390
InfoQ 2025 年趋势报告:软件架构和设计
软件架构如何建模
相信大家对模型一词都不陌生,但是在我们实际工作中进行软件架构设计的时候,要如何去建模呢?不知道大家是怎么去理解建模一词并能实际落地? 今天我来谈谈自己在软件架构中如何进行建模.
小坤探游架构笔记
2025/04/30
790
软件架构如何建模
【愚公系列】软考高级-架构设计师 109-软件架构演化原则
软件架构演化原则是指在软件架构设计和演化过程中应该遵循的一些指导性原则和规范,以确保软件系统在不断变化和迭代的过程中保持稳健、可维护和可扩展。
愚公搬代码
2024/08/15
1970
探寻软件架构的本质,到底什么是架构
本文将深入探讨软件架构的核心概念,解析“架构”这一术语的本质含义。将从软件架构的定义出发,阐述其在软件开发过程中的重要性,以及如何通过架构来实现技术和业务目标的对齐。通过对架构的深刻理解,本文旨在帮助开发者和架构师更好地把握软件设计的高层次视角,并作出明智的架构决策。
京东技术
2024/02/26
8050
探寻软件架构的本质,到底什么是架构
12种常见的软件架构风格,架构师必备
软件架构是定义软件系统的高级结构和组织的过程。它涉及识别和选择正确的组件,决定它们之间如何交互,以及确定它们应该如何组织以实现特定的目标。软件架构的目标是创建一个可维护、可扩展和安全的系统,能够满足用户和组织的需求。
程序新视界
2023/12/02
3K0
12种常见的软件架构风格,架构师必备
深度解析四大主流软件架构模型:单体架构、分布式应用、微服务与Serverless的优缺点及场景应用
🐯 大家好,我是猫头虎!在这个技术快速发展的时代,软件架构的演进无疑扮演着关键角色,尤其是对我们软件开发者来说。如何选择合适的软件架构,如何权衡其优缺点,无疑是我们每个开发者都要面临的问题。今天,我将深入探讨四种主流的软件架构:单体架构、分布式应用、微服务架构以及Serverless架构。我们将一起探讨它们的核心思想、优劣势以及典型的应用场景,帮助大家更精准地定位到适合自己项目的架构模型。希望这篇博客能够在你的技术道路上点亮一盏指路灯,并为你在软件架构的道路上披荆斩棘!💻🚀
猫头虎
2024/04/09
6.9K0
深度解析四大主流软件架构模型:单体架构、分布式应用、微服务与Serverless的优缺点及场景应用
软件架构设计-软件架构风格、分层架构
软件或计算机系统的软件架构是该系统的一个(或多个)结构,而结构由软件元素、元素的外部可见属性及它们之间的关系组成。
IT大咖说
2021/07/19
2.7K0
基于十余年实践的现代软件架构探讨
引言 多年的软件从业经验,给了我一个清晰的结论,好的软件是设计出来的。 当然,不只是好的软件,好的产品也是设计出来的。 对于一个大规模的软件系统,软件的架
Tiger 张虎
2024/12/24
6170
软考高级架构师:软件架构评估:敏感点、权衡点、风险点、非风险点
在软件架构评估过程中,我们需要关注几个重要方面,包括敏感点、权衡点、风险点和非风险点。这些点能够帮助我们全面了解软件架构的优缺点,并为改进和优化提供指导。以下是这些概念的详细解释:
明明如月学长
2024/05/25
2.2K0
关于软件架构的一切
软件开发可以描述为一个复杂的系统过程,需要在各个技术领域以及相关业务方面的专业知识。就像总体规划的蓝图一样,通过定义软件的体系结构,可以促进此软件开发过程的组成部分。
IT大咖说
2021/03/14
4480
浅谈软件架构
每一个程序员都有一个架构师的梦,可理想很丰满,现实很骨感---大部程序员工作中都做着简单的 CRUD,我也不例外。如果就这样还常把“架构”两个字挂在嘴边,估计程序员们都会脸红。但就因为暂时还不能成为架构师,我们就要放弃成为架构师的梦想了吗?显然不能,掌握架构设计的相关理论是成为架构师的前提,有了方法论可以更好地指导我们干活。机会总是留给有准备的人的,万一哪天梦想实现了呢?
政采云前端团队
2023/11/16
4900
浅谈软件架构
一文道尽软件架构及前端架构演进
人人都在说软件架构,但人们并不能给出一个准确的定义,就像Martin Folwer在《Making Architecture Matter》上分享说的,Architecture is about the important stuff. Whatever that is。
童欧巴
2020/04/08
8160
一文道尽软件架构及前端架构演进
《软件架构:生活中的无形智慧》
在当今数字化的时代,软件架构这个看似高深的概念,其实已经悄然渗透到我们生活的每一个角落。它不仅仅是科技领域的专业术语,更是一种影响我们生活方式的无形力量。
程序员阿伟
2024/12/09
1080
猫头虎分享: 探索软件系统架构的革新之路
在这篇博客中,我们将深入探讨软件系统架构的发展与革新。从单体应用到微服务,再到云原生架构,每一步都标志着技术的进步和思维的转变。对于软件工程师、架构师以及技术爱好者而言,这篇文章将提供关键的知识点和技术细节,帮助理解和把握架构设计的脉络。涵盖了微服务、容器化、DevOps、云计算等多个关键词,本文将是你理解软件架构演变的完美指南。
猫头虎
2024/04/07
1680
猫头虎分享: 探索软件系统架构的革新之路
软件架构与系统架构:区别与联系的分析
引言: 在信息技术领域,软件架构和系统架构这两个术语经常被提及。尽管它们在某些方面有重叠,但它们确实代表了不同的概念和聚焦点。理解这两种架构之间的区别和联系对于任何从事技术开发和设计的专业人士都是至关重要的。本文旨在深入探讨软件架构与系统架构的定义、差异以及它们之间的相互关系。
运维开发王义杰
2024/02/04
8380
软件架构与系统架构:区别与联系的分析
微服务架构设计 | 如何设计可拓展系统
在当今快速发展的技术世界中,系统的可扩展性已经成为了软件架构设计中的一个核心考量。随着用户基数的增长、数据量的爆炸式膨胀以及业务需求的不断变化,一个初期设计良好的系统也可能很快面临性能瓶颈和维护难题。因此,设计一个能够适应这些变化,同时保持高效、稳定和可管理状态的系统,对于确保企业的持续成功至关重要。
windealli
2024/02/19
5690
微服务架构设计 | 如何设计可拓展系统
【软件架构】软件架构权衡系列 - 第 1 部分
我们所说的“软件架构”有很多定义和含义。构成“软件开发”、“软件设计”和“软件架构”的内容之间也存在相当大的重叠,因为这三个概念在许多方面融合在一起。
架构师研究会
2022/09/26
3900
ROS:用于Automated Driving的模块化软件架构
自动驾驶对软件架构-Software Frameworks (SWFs)设计有着特殊的需求,若开始一个自动驾驶项目,作为开发者,我们可能会有如下几方面的诉求。
Defry
2022/04/19
1K0
ROS:用于Automated Driving的模块化软件架构
软件架构发展历程分享
架构的形式与特点 设计文档和代码 我们一般说的架构既包括架构的设计过程,也包括设计的产出物,一般可以包括各类设计文档、设计图,也可以包括一些技术验证代码、Demo 或者其他相关程序。文档的目的在于准确记录我们的思维产物,在软件尚未实现时,作为指导蓝图,尽量精确的描述清楚软件。 在软件的实现过程中,可能随时随着我们的深入研究,根据具体情况对文档做出局部的一些调整和修改。文档作为结项或交接的一部分,也是整个软件项目的产出物的一部分,成为公司 IT 资产的有机组成部分。 架构服务于业务 正如19世纪的伟大建筑
CSDN技术头条
2018/04/18
1.4K0
软考高级:软件架构评估-质量属性概念和例题
软件架构评估是对软件整体结构设计的系统性分析,旨在确保软件系统能够满足既定的质量要求。在这个过程中,质量属性扮演着关键角色,它们定义了软件系统必须达到的标准和性能。
明明如月学长
2024/05/24
1590
软考高级:软件架构评估-质量属性概念和例题
推荐阅读
相关推荐
InfoQ 2025 年趋势报告:软件架构和设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档