C语言快速入门——初遇库函数 c语言库函数怎么用
liebian365 2024-10-28 17:21 23 浏览 0 评论
寻找实现
要使程序能够被成功编译链接,我们需要为被调用的函数提供具体的实现。你也可能留意到了,我们一直使用的printf函数,只需包含对应的头文件,便可以保证程序链接的正确性。这是为什么呢?让我们根据现有的经验推测一下。
编写函数时,我们会先写下函数声明,然后在当前文件中实现函数定义。目前我们对函数的编写与使用都在同一文件中,而使用printf函数时,需要包含stdio.h,这表明我们有可能在此文件中找到printf函数的实现。
现在尝试打开一个项目,定位到 #include <stdio.h>这一行,点击鼠标右键,在弹出的菜单中选择【打开文档 stdio.h】命令,在打开的头文件中使用查找命令(Ctrl+F), 查找名称printf,找到printf函数的实现。另一种更快捷的方式是在函数名printf上点击右键,选择【转到定义】命令。然后会看到如下类似的代码。
是的,我们找到了printf的实现代码,可能看不懂。但这间接表明我们使用的C函数是有实现的,只不过不是在当前项目的.c文件中实现的。而是在.h文件中提供函数的实现。在头文件中定义函数是有一些限定规则,更多时候是在.c文件中实现函数的。
库函数
我们编写了求平均值函数来方便处理成绩数据,同理,其他开发者也可以编写函数供我们使用,库函数便是如此。它是由第三方编写的供我们使用的可复用代码。C语言为我们提供了处理字符串,时间、文本等必要的函数。使用这些函数,通常叫做调用库函数(库的概念我们以后会讲解),比如我们使用mkdir函数来创建文件夹。
由寻找printf函数的实现过程可以看出,库函数对应的函数声明通常在某个头文件。如使用mkdir时,需要包含direct.h。当你运行上面的程序时,它会在D盘下创建一个名为abc的文件夹。
初遇
有了寻找printf函数实现的经验,你可能也有兴趣寻找mkdir函数的实现。在direct.h中我们会看到如下代码:
好像有些不按套路出牌!对于printf函数,我们虽然读不懂,但至少能看到一对大括号包含的函数体实现。而mkdir,我们仅能看到一个类似函数声明的复杂表示(事实上就是函数声明)。说好的没有实现程序就不能成功链接呢?秘密在于mkdir的实现存在于某个库中,这便是C语言运行时库。上面的程序之所以能够编译成功,是因Visual Studio暗地里为我们做了一些工作,得以保证能能在C语言运行时库中找到mkdir的实现。
可以看出,有些函数在.h(更多的是.c)文件中以源代码的形式提供了函数的实现,库则是以别一种方式(通常是二进制形式)提供了函数实现的文件。当生成程序时,编译器从包含的文件中寻找被调用的函数声明,以保证函数使用的正确性,如参数个数,参数类型等。链接时再从库或实现文件中找到对应的定义,这样程序便会生成成功。
现在不必太过纠结库的概念,只需要保证会像mkdir那样使用库函数即可。等我们自己编写了库之后,一切将会真相大白。
相关推荐
- 基于超低功耗RJM8L151K8T6的指夹式血氧仪方案
-
一、基于超低功耗RJM8L151K8T6的指夹式血氧仪方案介绍指夹式脉搏血氧仪硬件检测电路主要有4个部分组成,光电传感器部分、模拟信号处理单元、MCU处理单元和显示输出部分。首先,光电传感器将采集到的...
- CSP-J复赛冲刺必刷题 | P2010 回文日期
-
学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:CSP-J复赛冲刺必刷题|汇总_热爱编程的通信人的博客-CSDN博客【题目描述】在日常生活中,通过年、月、日...
- 嵌入式面试常问的16个C语言问题(嵌入式面试常问的16个c语言问题及答案)
-
最近不少小伙伴在找工作,这里我给大家分享一下面试中经常会遇到的一些嵌入式C语言问题,你看看能答上来几个呢?1用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#defin...
- 程序员也有节日,你造吗?(程序员有休假吗)
-
程序员节,也叫"溢出节"。2009年7月24日,俄罗斯联邦通信与大众传媒部提出程序员节方案,9月11日,俄罗斯总统梅德韦杰夫签署法案,同意设立程序员节。日期为每年的第256天,即取其一字节(8位)溢出...
- 「面试题」程序员面试常问的16个C语言问题,你能答上来几个?
-
1.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#defineSEC_YEAR (365*24*60*60)UL考察点:1)#define语法的基本知识(例...
- 参加信息奥赛必须学C++吗?(信息奥赛好学吗)
-
针对目前格蠹科技推出的创客少年C语言编程2024春季班,很多人在问,这个跟NOIP(NationalOlympiadinInformaticsinProvinces,全国青少年信息学奥林匹克...
- 微软提醒开发人员:要注意闰年问题
-
ZD至顶网软件频道消息:2016年2月4日消息,微软近期发表了一篇技术博客,提醒开发者为2016年闰年可能产生的问题做好准备。高级软件工程师MattJohnson在文章中提及,开发人员需要注意以...
- USACO备考冲刺必刷题 | P1202 Friday the Thirteen
-
学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考学习过程中的题目,记录每一个瞬间。附上汇总贴:USACO备考冲刺必刷题|汇总-CSDN博客【题目描述】13号又是一个星期五,那么13...
- 5年程序员总结—这几个C语言问题超纲了,小白勿进
-
问题如下:(答案见下问)20.1怎样从一个函数返回多个值?20.2怎样访问命令行参数?20.3怎样写数据文件,使之可以在不同字大小、字节顺序或浮点格式的机器上读入?20.4怎样调用一个由...
- C++选择结构,让程序自动进行决策
-
什么是选择结构?正常的程序都是从上至下顺序执行,这就是顺序结构。然而,很多时候,程序需要进行决策,哪些代码需要执行,哪些不需要执行,比如:火车站中,一名成年人可以免费携带一名未满1.2米的儿童进站乘车...
- c++学习大纲总结(c++基础大纲)
-
基础简介:从c到c++c++学习之概述–从C到C++三大性质之封装性c++学习之类与对象c++学习类中的常量const、友元、运算符重载三大性质之继承性c++学习继承性、类图、Makefilec++...
- C++20 新特性(24):模板访问权限和typename的放宽
-
模板访问权限的放宽当使用嵌套类(定义在类内部的类)进行模板特化或偏特化时,如果这个嵌套类的访问权限是私有或者保护时,按照以前的C++语法标准,是没有权限进行访问的。但这样的代码在开发模板库时是很常...
- 程序员效率分享:加速C ++编译(c++ 编译速度)
-
更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)这篇文章将介绍一些用于加速C++编译的源代码级技术。它不会谈论C++外部的事情,例如购买更好的硬件,使用更好的构建系统或使用更智能的...
- C++高效序列化 Boost.Serialization 介绍 - 朝荐开源
-
Boost.Serialization是Boost库中专门用于对象序列化的组件,具有强大的类型支持和灵活性。它提供了一种简单的方式把任意复杂的C++对象保存到文件或内存缓冲区,然后再从这些文...
- C++中重载运算符的使用(c++重载操作符)
-
C++中重载运算符的使用:用户定义的类型,如:字符串,日期,复数,联合体以及文件常常重载二元+操作符以实现对象的连接,附加或合并机制。但是要正确实现+操作符会给设计,实现和性能带来一定的挑战。...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)