问题描述:

某个函数fun_1()是在lib内,没法修改的,在程序中大量的使用了该函数,现在想把原本fun_1失效(现在失效的方法是#define fun_1(..)),用另外一个函数fun_2(),可是fun_2最后也需要调用fun_1,上面的失效方法感觉就不行了,请问怎么做才对?



我把问题简单整理下:

  1. 我们库文件里有个函数是read()
  2. 我们现在要自己定义一个名字一样的函数read(),
  3. main()函数首先调用我们自己定义的函数read()
  4. 自己定义的函数,要再定义库文件中的read()函数。

粉丝提问,必须安排!一口君实力宠粉!

想学习C语言、Linux、驱动、ARM的同学可以加一口君好友。

解决思路-static

如果我们要使用一个和库函数相同名字的函数,就要借助static关键字。

在函数的返回类型前加上static,就是静态函数。其特性如下:

  1. 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
  2. 不同的文件可以使用相同名字的静态函数,互不影响
  3. 其他库如果有相同的函数名,有限使用本文件的静态函数

举例

系统调用函数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

粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数的更多相关文章

  1. 【C语言】定义一个函数,求长方体的体积

    #include<stdio.h> int volume(int a, int b,int c)/*定义函数*/ { int p; p = a * b * c; return p; } i ...

  2. 定义一个“点”(Point)类用来表示三维空间中的点(有三个坐标)。要求如下: (1)可以生成具有特定坐标的点对象。 (2)提供可以设置三个坐标的方法。 (3)提供可以计算该“点”距原点距离平方的方法。 (4)编写主类程序验证。

    package b; public interface ZuoBiao { double zuobiao(); } package b; public class Point implements Z ...

  3. 1 实现添加功能 1.1 定义一个学员类(Student),在Student类中定义姓名、性别和年龄属性,定义有 参数的构造方法来初始化所以的成员属性 1.2 创建学员类对象来存放学员信息,并且为每一个学生对象添加的相应的编号。并将 学员类对象添加到Map<Integer,Student>集合中 1.3 添加完成后,显示所有已添加的学员姓名 1.4 限制年龄文本框只能输入正整数,否则的会采

    学生类 package com.lanxi.demo1_3; public class Student { private String name; private String sex; priva ...

  4. Go语言笔记[实现一个Web框架实战]——EzWeb框架(一)

    Go语言笔记[实现一个Web框架实战]--EzWeb框架(一) 一.Golang中的net/http标准库如何处理一个请求 func main() { http.HandleFunc("/& ...

  5. Java 基础 面向对象: 接口(interface )概念 以及接口之练习3 -定义一个接口用来实现两个对象的比较并 判断instanceof是否为同类

    接口(interface )概念概念笔记 及测试代码: /** 面向对象: 接口(interface ) 是与类并行的一个概念: * 1.接口可以看成一个特殊的抽象类,它是常量与抽象方法的一个集合 * ...

  6. 定义一个外部类Father,有成员变量name并赋一个初值。

    1.内部类的使用:(1)定义一个外部类Father,有成员变量name并赋一个初值.(2)定义一个内部类Child,并定义一个getValue()方法,在方法中调用外部类Father的name变量.( ...

  7. 编写Java程序,定义一个类似于ArrayList集合类

    返回本章节 返回作业目录 需求说明: 设计一个类似于ArrayList的集合类ListArray. ListArray类模拟实现动态数组,在该类定义一个方法用于实现元素的添加功能,以及用于获取List ...

  8. C语言定义一个指针变量

    10.2.1 定义一个指针变量 对指针变量的定义包括三个内容: (1) 指针类型说明,即定义变量为一个指针变量: (2) 指针变量名: (3) 变量值(指针)所指向的变量的数据类型. 其一般形式为: ...

  9. C语言入门教程: 一个简单的实例

    对于学习要保持敬畏! 语言不只是一种工具,还是一种资源,因此,善待它,掌握它!   我们知道,对于未知通常都会充满好奇和畏惧,既想了解它,又害怕神秘面纱隐藏的不确定性.对于一门编程语言同样如此,我将以 ...

  10. 【C语言】03-第一个C程序代码分析

    前面我们已经创建了一个C程序,接下来分析一下里面的代码. 项目结构如下: 一.代码分析 打开项目中的main.c文件(C程序的源文件拓展名为.c),可以发现它是第一个C程序中的唯一一个源文件,代码如下 ...

随机推荐

  1. Spring之webMvc异常处理

    异常处理可以前端处理,也可以后端处理. 从稳妥的角度出发,两边都应该进行处理. 本文专门阐述如何在服务端进行http请求异常处理. 一.常见的异常类型 当我们做http请求的时候,会有各种各样的可能错 ...

  2. 【BUG记录】Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xA6' for column 'name' at row 1

    大家好呀,我是summo,这次的文章标题是一个Mysql数据库的SQL错误,遇到的同学自然懂,没遇到的同学希望你永远也不要遇到. 一.错误说明 Cause: java.sql.SQLException ...

  3. python基础-基本语句

    1 条件语句 在进行逻辑判断时,我们需要用到条件语句,Python 提供了 if.elif.else 来进行逻辑判断.格式如下所示: 1 if 判断条件1: 2 执行语句1... 3 elif 判断条 ...

  4. 全国产!全志A40i+Logos FPGA核心板(4核ARM Cortex-A7)硬件说明

    硬件资源 SOM-TLA40iF核心板板载ARM.FPGA.ROM.RAM.晶振.电源.LED等硬件资源,并通过B2B连接方式引出IO.核心板所有器件(包括B2B连接器)均采用国产工业级方案,国产化率 ...

  5. mac 安装jdk1.8 附详细教程

    详细步骤 下载 链接: https://pan.baidu.com/s/1xQr6_9_7lFNtSes7HsKveA 密码: edme 安装包 一直按继续 配置系统环境变量 上一步骤,实标上,我们只 ...

  6. c 语言学习第五天

    break 语句 在循环体中使用 break,可以跳出循环 打印 10 以内的数. #include<stdio.h> int main(){ int i,j = 20; for(i = ...

  7. PHP中引用的详解(引用计数、写时拷贝)

    转载:https://blog.csdn.net/ljguo212/article/details/8972865 1. PHP中引用的特性 PHP中引用意味着用不同的名字访问同一个变量内容,引用不是 ...

  8. Divide Interval 题解

    背景 太逊了,调了三次才调出来,所以写篇题解寄念.LC好睿智 题意 给你两个数 \(a,b\),现在要从 \(a\) 跑到 \(b\),每次可以将当前的 \(a\) 拆分成 \(2^n\times m ...

  9. 【译】使 Visual Studio 更加可视化

    任何 Web.桌面或移动开发人员都经常使用图像.你可以从 C#.HTML.XAML.CSS.C++.VB.TypeScript 甚至代码注释中引用它们.有些图像是本地的,有些存在于线上或网络共享中,而 ...

  10. [rCore学习笔记 012]彩色化LOG

    实验要求 实现分支:ch1 完成实验指导书中的内容并在裸机上实现 hello world 输出. 实现彩色输出宏(只要求可以彩色输出,不要求 log 等级控制,不要求多种颜色) 隐形要求 可以关闭内核 ...