粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数
问题描述:
某个函数fun_1()是在lib内,没法修改的,在程序中大量的使用了该函数,现在想把原本fun_1失效(现在失效的方法是#define fun_1(..)),用另外一个函数fun_2(),可是fun_2最后也需要调用fun_1,上面的失效方法感觉就不行了,请问怎么做才对?
我把问题简单整理下:
- 我们库文件里有个函数是read()
- 我们现在要自己定义一个名字一样的函数read(),
- main()函数首先调用我们自己定义的函数read()
- 自己定义的函数,要再定义库文件中的read()函数。
粉丝提问,必须安排!一口君实力宠粉!
想学习C语言、Linux、驱动、ARM的同学可以加一口君好友。
解决思路-static
如果我们要使用一个和库函数相同名字的函数,就要借助static关键字。
在函数的返回类型前加上static,就是静态函数。其特性如下:
- 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
- 不同的文件可以使用相同名字的静态函数,互不影响
- 其他库如果有相同的函数名,有限使用本文件的静态函数
举例
系统调用函数read(),定义如下:
现在我们想定义一个自己的函数,名字也是read,要如何操作呢?
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
static void read()
{
printf("my read func()\n");
}
int main()
{
read();
}
我们可以看到,虽然我们添加了系统调用read()的头文件,但是调用的是我们自己定义的read()函数。
下面我们来看下,如果我们定义的read函数又想调用系统调用read()函数应该怎么办呢?
那就必须再增加一个文件,把相关功能放到另外一个文件中,在同一个文件中是没有办法实现的。
上代码,不上代码,没有论据的知识点都是耍流氓。一口君绝大部分文章都是有实例代码支撑,
//test.c
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5
6
7 void test()
8 {
9 int fd;
10 char buf[128]={0};
11
12 fd = open("123.c",O_RDWR);
13 if(fd<0)
14 {
15 perror("open fail\n");
16 return;
17 }
18 read(fd,buf,16);
19 printf("enter test():%s\n",buf);
20 }
//123.c
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5
6 extern void test();
7 static void read()
8 {
9 printf("my read func()\n");
10 test();
11 }
12 int main()
13 {
14 read();
15 }
执行结果
由执行结果可知,程序既调用到了我们自己调用的read()函数,也调用到了系统调用函数read().
函数调用关系如下:
更多嵌入式Linux 入门的知识 ,请关注 一口Linux
欢迎关注公众号:一口Linux
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」