当前位置: 首页 > article >正文

C语言11--特殊函数

静态函数

  • 背景知识:普通函数都是跨文件可见的,即在文件 a.c 中定义的函数可以在 b.c 中使用。
  • 静态函数:只能在定义的文件内可见的函数,称为静态函数。
    • 因此静态函数一般会被写在头文件中方便任何需要调用的文件直接包含即可
  • 作用:被static修饰的函数的可见范围被缩小,因此可以降低在项目中同名的函数冲突问题
  • 语法:
staitc void __f(void) // 在函数头前面增加关键字 static ,使之成为静态函数
{
    // 函数体
}
  • 要点:
    • 静态函数主要是为了缩小函数的可见范围,减少与其他文件中重名函数冲突的概率。
    • 静态函数一般被定义在头文件中,然后被各个源文件包含。

递归函数

  • 递归概念:如果一个函数内部,包含了对自身的调用,则该函数称为递归函数。
  • 递归问题:
    • 阶乘。
    • 幂运算。
    • 字符串翻转。
  • 要点:
    • 只有能被表达为递归的问题,才能用递归函数解决。
    • 递归函数必须有一个可直接退出的条件,否则会进入无限递归。
    • 递归函数包含两个过程,一个逐渐递进的过程,和一个逐渐回归的过程。
      • 在递进的过程中每递进一次就应该把问题规模缩小一次,直到能直接给出结果后回归
  • 示例:依次输出 n 个自然数。

回调函数(钩子函数)

  • 概念:函数实现(设计方)方不调用该函数,而由函数接口提供方间接调用的函数,称为回调函数。
  • 示例:系统中的信号处理,是一个典型的利用回调函数的情形。

信号处理

  • 要点:
    • 示例中函数 sighandler 是回调函数。
    • signal() 将函数回调函数传递给内核,使得内核可以在恰当的时机回调 sighandler。
    • 应用开发者和内核开发者只要约定好回调函数的接口,即可各自开发,进度互不影响。

内联函数:

内联函数是一种编程语言特性,用于在编译时将函数的代码插入到每个调用该函数的地方,而不是通过常规的函数调用来执行。这样可以减少函数调用的开销,提高程序的执行效率。内联函数通常适用于简单的、需要频繁调用的函数。

在C++中,可以使用关键字inline来声明内联函数。例如:

inline int add(int a, int b) 
{
    return a + b;
}

在上面的例子中,add函数被声明为内联函数,这意味着在每次调用add函数时,编译器会将函数的代码插入到调用该函数的地方,而不是通过常规的函数调用来执行。

需要注意的是,内联函数适用于函数体较小且调用频繁的函数,对于函数体较大或调用不频繁的函数,使用内联函数可能会导致代码膨胀,影响程序的性能

时(效率)空(内存空间)交换:

使用时间来换取空间,使用空间来换取效率时间。

如上图如何把函数B的代码直接融入到被调用的地方去,就可以在函数B的函数头中添加inline 关键字来修饰它:

inline float  add ( int x , float y )
{
    // 为所欲为
    return x+y;
}

结语:

        在本文中,我们深入探讨了C语言中的几种特殊函数:静态函数、递归函数、回调函数和内联函数。每一种函数都有其独特的特点和适用场景,灵活运用这些工具,将极大丰富我们的编程能力和程序设计理念。        

  • 静态函数有效管理了函数的作用域,使得在模块内部定义的函数能够更好地封装,实现信息隐藏,避免命名冲突。
  • 递归函数是解决复杂问题的一种优雅方式,通过自我调用的方法将问题分解,有助于理解算法的设计和实现。
  • 回调函数增强了程序的灵活性,尤其是在事件驱动编程中,允许我们传递函数作为参数,使得代码更具有可扩展性和复用性。
  • 内联函数则提供了在提高效率和减少函数调用开销之间的平衡,是优化性能的重要手段。

http://www.kler.cn/news/308678.html

相关文章:

  • git删除本地分支报错:error: the branch ‘xxx‘ is not fully merged
  • 1分钟解决 -bash: mvn: command not found,在Centos 7中安装Maven
  • 【代码随想录训练营第42期 Day58打卡 - 图论Part8 - 拓扑排序
  • 微信小程序----日期时间选择器(自定义时间精确到分秒)
  • Redis -- 全记录(面试)
  • tensor连接和拆分
  • mysql学习教程,从入门到精通,MySQL 子查询 子句(11)
  • 高级I/O知识分享【epoll || Reactor ET,LT模式】
  • Numba基础
  • vue.nextTick()方法的使用
  • python怎么运行cmd命令
  • 网络协议头分析
  • 【PostgreSQL-patroni维护命令】
  • 基于vue框架的宠物寄养系统3d388(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • USB开启ADB设置流程
  • 麒麟操作系统 MySQL 主从搭建
  • Qt QDialog点击界面自动激活问题解决办法
  • 枚举类题目练习心得
  • Golang | Leetcode Golang题解之第403题青蛙过河
  • 【题解】CF2009G1
  • QtC++截图支持获取鼠标光标
  • 运维工程师面试整理-虚拟化与容器
  • 实时数仓3.0DWD层
  • vulnhub(7):Toppo(经典的suid滥用提权)
  • ArcGIS Pro SDK (十四)地图探索 1 地图视图
  • 探索 InternLM 模型能力边界
  • 什么是外贸专用路由器?
  • 后端开发 每天六道面试题之打卡第一天
  • python中的各类比较与计算
  • Android14 蓝牙 BluetoothService 启动和相关代码介绍