简单说说C语言标准库和嵌入式C语言标准库

C 语言标准库glibc和musl c的差异和各自优势 C 语言的标准库glibc和musl c 阅读详情

目录

例子说明C语言标准库和嵌入式C语言标准库是有区别的

一个小问题?

C语言中实现多态的方法

定义虚函数

函数指针来模拟

回调函数实现

总结


例子说明C语言标准库和嵌入式C语言标准库是有区别的

我们从一个重定向的例子引入,一是在Linux GCC环境下,另一个是使用HAL库开发stm32串口应用。

在Linux GCC环境下,当我们要将标准输出(printf)重定向到其他文件的时候,是先将标准输入的文件描述符关闭,即关闭0号文件描述符,打开需要重定向的文件,进程就会将0号文件描述符分配给这个文件,标准输出默认会向0号文件描述符写内容。

使用HAL库开发stm32串口应用的时候,当我们想要通过调用标准输出向串口发送消息的时候,需要重写fputc弱函数,因为在嵌入式C标准库中,标准输出中最后是调用了fputc函数,一个字符一个字符的发送的。

从这个地方,我们就能看的出来,由ISO C标准定义的C语言标准库与嵌入式C标准库的不同了,多在文件系统和操作系统的系统调用的方面有所不同。 在MicroLIB中,fputc函数的默认历程是什么都不做,需要用户重写,HAL库在默认历程中调用用户重写后的fputc函数。

一个小问题?

这里又有一个问题?C语言是如何做到重写和多态的呢?我们知道在C++中,当我们利用面向对象的多态特性的时候,派生类中重写基类中定义的虚函数,使用指向派生类的基类指针调用虚函数,在运行时会发生动态绑定(动态多态)。

C语言中实现多态的方法

下面就介绍几个C语言中实现多态的方法

定义虚函数

MicroLIB 库中的实现方法,定义_weak弱函数。他的原理是:在编译链接的时候,使用用户重写的fputc函数的地址,代替弱函数int fputc(int /ch/, FILE /fp/)函数的地址,如果用户没用重写,就使用弱函数_weak int fputc(int /ch/, FILE /fp/)函数的地址(这时的编译器对每个函数生成符号表目的时候,还会标记强弱属性,链接器最终会选择强属性的函数或者变量的地址)。

函数指针来模拟

使用函数指针来模拟实现多态

当派生类中的第一个成员基类的指针的时候,第一个成员的地址就是基类的地址。当我们使用基类指针指向派生类的时候,只要在调用派生类中的方法的时候,将他强转之后就可以了。

回调函数实现

最后说一个比较流氓的方法:使用回调函数实现多态。

我们回顾一下多态的本质,同一个接口,不同的上下文中执行不同的实现。

回调函数是将函数指针作为参数,传递给另一个实现多态的函数,这个函数在合适的使用通过函数指针调用函数。这样也就变相的实现了多态。

这样的实现方式呢,通常是在操作系统内核中,如Linux操作系统内核,嵌入式系统,如HAL库,库设计中,如thread库封装LWP轻量级进程...

总结

C语言标准库在大体上可以分为两类,一类是由ISO C标准定义的C语言标准库,另一类是嵌入式C标准库,这两类不是完全不同的两个库,而是同一标准的不同实现。

C语言标准库,在PC/服务器等环境中,标准库的实现依赖于操作系统(如Linux的glibc、Windows的MSVCRT)。功能完整,但代码体积较大,依赖操作系统。

嵌入式C标准库是对嵌入式系统资源受限的特性(内存小、无操作系统),对标准库进行精简或优化后的实现。

比如:

MicroLIB(ARM Keil专用):高度精简,代码体积小,直接调用用户实现的底层函数(如fputc)。

newlib(GCC常用):功能较完整,但允许用户重定向底层接口(如_write)。

移除对操作系统的依赖(如文件系统、多线程)。

保留标准接口(如printf),但要求用户自行实现硬件相关的底层函数(如字符发送)。

C标准库的进化:从C89到C18 C语言自1972年由丹尼斯·里奇和肯·汤普逊在贝尔实验室开发以来,已经成为现代编程的基石。它以简洁、高效和灵活性著称,被广泛用于系统编程、嵌入式系统、操作系统开发等领域。C标准库(C Standard Library)是C语言的核心组成部分,为开发者提供了丰富的函数和数据结构,用于执行输入输出、字符串操作、内存管理、数学计算等任务。自C语言标准化以来,C标准库经历了多次更新和扩展,从C89(也称为ANSI C)到最新的C18标准。本文将详细探讨C标准库的演变过程,分析其在不同标准版本中的变化和改进。 阅读详情

相关推荐

深入探索C标准库源码与嵌入式编程实践

本文还有配套的精品资源,点击获取 简介:本项目以C语言编程实践为核心,重点关注C标准语言函数库的使用与源码分析。介绍了C语言在系统编程、嵌入式开发中的应用,深入讲解了C标准库(libc)中关键函数的实现与应用,包括输入输出、字符串处理、时间管理、内存分配等。项目还探讨了如何在AT89C2051微控制器上实现电子时钟功能,涵盖中断处理、硬件控制等关键嵌入式编程概念。源码文件包...

weixin_35749440的博客 1257

嵌入式 C 语言(上)

目录基础知识数据类型const 用法作用域与 static 用法extern 用法 基础知识 嵌入式C语言和普通C语言在语法上几乎没有差别,其主要差别在于普通C语言的运行环境是OS之上,有很多的标准库函数支撑调用,分配的内存是电脑的内存,其处理器就是电脑的CPU;而在嵌入式环境中,会涉及到底层的硬件,而硬件本身是没有标准库可以调用的,因而就需要开发者使用C语言编程调试硬件,使其可以工作,对于开发某一款芯片,有针对的编译器(或者交叉编译环境),可以分配的内存则是芯片的RAM、Flash,处理器则是芯片自身带的

韦东山嵌入式专栏 1万+

全面掌握嵌入式C语言编程技巧

本文还有配套的精品资源,点击获取 简介:嵌入式系统是计算机科学的重要分支,要求高效的编程语言和硬件控制能力。C语言因其性能优势成为嵌入式开发的首选。本课件深入探讨嵌入式环境中C语言的有效使用,从基础语法到内存管理、位操作、中断处理和硬件接口编程等关键技能,旨在教授如何在没有或具有RTOS的操作系统上进行高效编程。同时,还将介绍实时编程概念、调试技巧和最佳实践,以便学生能将所...

weixin_35761094的博客 1828

七、C语言标准库

很多嵌入式工程师,基本都了解,但C中除了这个还有很多其他标准库文件,今天主要介绍常用的C语言库,如、、、及等

weixin_43627682的博客 2095

C语言标准库函数参考与实战

HTML格式C语言函数库是一种将C语言的函数库文档化的方法,它通过HTML的结构化特性来组织和展示函数库的细节信息。C语言作为一种广泛使用的编程语言,其丰富的标准库函数为开发者提供了强大的工具。标准库函数不仅包括了基础的输入/输出操作,字符串处理,数学计算等,还涉及内存管理,文件操作等多种功能。这些函数库为编程工作提供了便利,同时也要求开发者深入理解其原理和使用技巧,以便更高效地开发稳定和性能优化的应用。随着C语言在系统编程和嵌入式开发中的重要地位,掌握这些函数库的细节变得尤为重要。

weixin_42361478的博客 807

利用 vivado实现加减法器的设计

本科计组实验:利用 vivado实现加减法器的设计

qq_52052302的博客 1万+

Linux编程使用的C语言标准库和system call

系统调用的例子包括打开文件的 open()、从文件读取数据的 read()、向文件写入数据的 write()、创建新进程的 fork()、执行新程序的 exec()等。5. 其他相关头文件: 除此以外,/usr/include/linux 和 /usr/include/sys 中还有许多其他头文件,它们提供了特定系统调用和相关数据结构的定义。Glibc 还包括一些配置文件和目录,如 /etc/ld.so.conf 和 /etc/ld.so.conf.d/,它们指定了运行时搜索共享库的目录。

guoqx的专栏 956

Microduck机器鸭开源AI项目:本地部署与模型微调实战指南

开源AI模型的本地化部署与定制化训练正成为开发者关注的技术趋势。与依赖云端API的在线服务不同,本地部署允许用户将模型权重下载至自有GPU环境,通过命令行或WebUI完成推理、批量任务处理及API集成,在数据隐私、离线使用和接口稳定性方面具备天然优势。模型微调则基于预训练权重,利用领域数据训练特定任务,从而提升生成质量与业务适配度。这一技术路径广泛应用于内容生成、智能对话、自动标注等场景,尤其适合消费级显卡开发者、数据敏感型团队及二次开发研究者。Microduck(机器鸭)作为近期预售火爆的开源项目,围绕“

weixin_29082143的博客 412

什么是 C 和 C++ 标准库?

本文简要介绍编写 C/C++ 应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的。 C 和 C++ 是如何制订的 当我们谈论 C 和 C++ 时,实际上是指一组定义(程序)语言应该做些什么,如何表现,应该提供哪些功能的规则。C/C++ 的编译器为了处理 C/C++ 编写的源代码必须跟随着这些规则,并生成二进制应用程序。听起来非常接近于 HTML:浏览器遵循着一组指令,所以...

小白的逆袭 1624

Camera tuning flow相机调试流程

相机调试流程分为三大模块:ProcessRaw处理原始数据(黑电平校正、阴影校正),3A实现自动控制(曝光/对焦/白平衡),ISP进行图像精加工(伽马校正、锐化降噪、色彩处理)。三个阶段环环相扣,前阶段为后阶段提供基础,最终输出画质优良且风格化的图像。

weixin_64706696的博客 1229

西门子SCL出栈入栈算法(附带源码)

栈是一种数据结构,它的特点是数据后入先出(Last In First Out,LIFO)或者说是先入后出,意思是一样的。栈有三个基本动作:初始化、入栈和出栈。接下来给大家介绍下我使用SCL语言编写的栈函数,它以不定长数组作为存储区,以实数作为数据类型,实现了栈的初始化、入栈和出栈的操作。

CHUXUEZHE8210的博客 2330

C/C++——C语言标准、C语言标准库、 C标准库实现glibc, uClibc, Elibc

C语言标准 C语言作为一种常用的计算机开发语言,被用于各种领域,尤其是单片机与嵌入式的开发,在现阶段更有着无可替代的作用,我也经常会使用C语言进行各种开发,使用过程中我们经常会听说 GUN C 、ANSI C、标准C这几个术语,在了解这几个术语对应的C标准之前,我们需要先了解三个组织,分别是自由软件基金会,美国国家标准学会以及国际标准化组织。下面对其三个组织进行简单说明: 自由软件基金会:是美国...

静水流深且细水长流 2267

推荐系统在音乐领域的实践:网易云音乐推荐算法解析

你是否有过这样的经历?打开网易云音乐,“私人FM”里总能推到你想听的歌;“每日推荐”的歌单,往往藏着你没听过但一入耳就爱上的曲目。这些“懂你”的推荐背后,是一套复杂却精密的推荐系统在运转。问题陈述:音乐推荐的难点远超一般商品——音乐是高度主观的艺术,用户兴趣易随心情、场景变化;小众音乐的“长尾效应”显著,如何让冷门好歌被发现?传统协同过滤依赖历史行为,面对新用户/新歌曲的“冷启动”问题束手无策;而单纯的内容推荐又难以捕捉用户的隐性兴趣。核心方案:网易云音乐采用“混合推荐策略”——融合协同过滤(CF)

AI天才研究院 2085

嵌入式C语言概述

嵌入式C语言概述

m0_46566693的博客 1931

用C++手把手教你连接SimNow期货模拟盘:从CTP API封装到第一个订单(附完整代码)

本文详细介绍了如何使用C++连接SimNow期货模拟盘,从CTP API的基础架构解析到实现第一个订单的完整流程。内容涵盖CTP API的封装、SimNow环境配置、交易通道实现、行情接收与处理等核心环节,并提供完整代码示例,帮助开发者快速掌握量化交易中的期货模拟盘连接技术。

weixin_27215337的博客 328

Transformer时间序列预测-多变量输入-单变量输出+多变量输出,完整代码数据,可直接运行

Transformer时间序列预测-多变量输入-单变量输出+多变量输出,完整代码数据,可直接运行

9792

Arduino代码和C语言、C++的区别

Arduino代码是C++:Arduino编程语言是基于C++的,利用了C++的类和对象机制。初学者感觉像是C语言:Arduino代码的语法和结构更接近C语言,尤其是对于初学者来说,它更易于理解和使用。适合嵌入式开发:Arduino的编程环境和库设计使得嵌入式开发更加简单,适合初学者快速上手。因此,虽然Arduino代码本质上是C++,但对于初学者来说,可以将其视为一种简化版的C语言。

视睿 1949

45、概率与模糊性:粗糙事件与模糊事件概率的探索

本文探讨了概率理论与模糊性理论在处理现实世界不确定性中的应用,重点分析了模糊事件和粗糙事件的概率定义、性质及其条件概率。同时,介绍了近似贝叶斯网络分类器在信息系统中的应用,以及如何通过概率决策约简提高分类效率。这些方法为处理不确定信息提供了灵活的工具,并在决策和数据分析中具有重要价值。

ik67890123的博客 131

C语言的嵌入式系统

嵌入式系统是一个专用系统,它的硬件和软件都是为特定的应用而设计的。专用性:为了特定的功能而设计,性能优化。实时性:许多嵌入式系统要求能够在特定的时间内完成任务。低功耗:尤其是在电池供电的设备中,节能至关重要。小型化:体积通常紧凑,便于嵌入到其他设备中。高可靠性:许多嵌入式设备在工作过程中不能出现故障,要求高可靠性和稳定性。

2501_91324988的博客 1953

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

c语言标准库

标准库(Standard Library)是C语言重要的一部分,不过学习C语言这么长时间,都没有细致的了解过标准库到底中包含哪些内容,这几天打算来仔细看看这部分内容。 C语言标准库有各种不同的实现,比如最著名的glibc, 用于嵌入式Linux的uClibc,还有ARM公司的自己的C语言标准库及精简版的MicroLib等。不同标准库的实现并不相同,而且提供的函数也不完全相同,不过有一个它

一技旁身 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C语言标准库源代码:深入解析C语言核心函数实现

C语言标准库源代码:深入解析C语言核心函数实现 【下载地址】C语言标准库源代码 探索C语言标准库的奥秘,本开源项目汇集了常用标准库函数的源代码,如`printf`、`sprintf`、`scanf`和`sscanf`等,以`.c`文件形式呈现,文件名采用大写命名,结构清晰,便于学习和研究。无论你是C语言初学者,还是资深开...

gitblog_06794的博客 571

嵌入式科普(29)c代码究竟是如何一步步运行的之C语言运行的本质

C语言运行的本质是栈式函数调用和编译型语言C函数调用栈的分析是重要技能理解C语言的编译链接原理。

cl234583745的博客 1193

C语言标准库函数

C语言标准库提供了一组丰富的函数,这些函数为程序员提供了各种各样的功能,从输入输出操作到字符串处理,再到数学运算和内存管理等。这些函数被组织在多个头文件中,程序员可以根据需要包含相应的头文件来使用这些函数。

科技改变人类,技术成就未来 905

C标准库源代码很全:助力C语言编程,提升项目开发效率

C标准库源代码很全:助力C语言编程,提升项目开发效率 去发现同类优质开源项目:https://gitcode.com/ 在编程的世界中,C语言作为一门基础且强大的语言,其核心功能在众多开发场景中发挥着重要作用。今天,我要为大家推荐一个开源项目——C标准库源代码(很全),它提供了一个完整的C标准库源代码集合,帮助开发者更好地掌握C语言的核心功能。 项目介绍 C标准库源代码(很全)是一个开源项目,旨在...

gitblog_06786的博客 898

【漫谈C语言和嵌入式020】深入探秘 C 语言标准库:探索高效编程的宝库

C 语言标准库为开发者提供了一套丰富的工具集,涵盖了几乎所有常见的编程需求。从字符串操作到内存管理,再到数学计算和时间处理,标准库的函数在提高代码质量和开发效率方面发挥着不可替代的作用。

2403_83044722的博客 807
上一篇: C语言 详谈变量和常量
下一篇: C语言 运算符
万我.
博客等级 码龄1年 460粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值