嵌入式C语言可以带“默认参数”的函数吗

(文章来源:嵌入式时代)
使用c++开发过程序时,定义函数可以指定默认参数,例如 void fun(int x, int y=3); 在调用 fun() 时第二个参数可以不传递,此时 fun() 函数默认第二个参数等于 3,例如 f(1) 就相当于 f(1,3)。这是一个很好用的特性,那么在c语言程序开发中,是否也可以定义带“默认参数”的函数呢?
首先应该清楚,目前c语言还没有原生支持带默认参数的函数,也就是说下面这样的c语言代码是非法的:void fun(int x, int y =3){return x+y;}fun(1); // 不等价于 fun(1, 3)。
但是,c语言作为一门极其灵活的编程语言,又的确可以借助其他基本语法实现这样的需求。不过要在c语言中定义带“默认参数”的函数可能略微有些繁琐,当然了,方法可能不止一种,本文不打算从枯燥的理论层面讨论这些方法,而是给出一个实例,希望能够起到抛砖引玉的作用。
假设我们希望在某段c语言程序中定义一个带默认参数的函数,它可以接收两个参数,并将之打印出来:double f(int i, double x){printf(i=%d, x=%0.2f\n, i, x);return x;}。现在期望调用 f 时,如果不显式指定参数,f 的两个默认参数为 (i=8, x=3.14),例如:f(); // 输出 i=3, x=3.14f(1); // 输出 i=1, x=3.14f(2, 6.28); // 输出 i=2,x=6.28。
c语言自然没有支持这种需求的原生语法,但是为了实现这样的目的,可以定义下面这个结构体,请看相关c语言代码:typedef struct {i;double x;f_args。接着,定义 f_base() 函数,它的c语言代码实现和 f() 是一样的,目的是让 f_base() 函数具有期望的 f() 函数功能。
显然,从上述c语言代码来看,var_f() 函数实现了默认参数的功能。现在再定义一个带可变参数的宏,这样一来,调用者就不必知道结构体 f_args 的结构了:#define f(...) var_f((f_args){__va_args__})。上述c语言代码在 main() 函数中调用 f() 函数,并分别传递了不同的参数,编译并执行之,得到如下结果:# gcc t.c# ./a.outi=3, x=8.00i=1, x=2.30i=2, x=3.14i=8, x=9.20。
可见,c语言是一门极其简洁灵活的编程语言,其他编程语言中一些好用的特性,可能c语言没有原生语法支持,但是我们却可以组合其他基本语法,自己实现这些好用的特性。不过应该注意,有件事是行不通的——f(0),因为上述实现我们无法在 var_f() 中区分 “0”究竟是调用者传递的,还是默认值,不过我相信聪明的读者应该能够想到解决这样的问题的方法。

超声波塑料焊接机的焊接方法以及它的优点介绍
GTC23 | 五场热门网络专题演讲亮点集锦!
90Hz的电竞屏好机,OPPO Reno Ace当之无愧
关于堆栈的深入理解
模拟电路怎么分析法解析
嵌入式C语言可以带“默认参数”的函数吗
亿佰特将推出基于TI CC2340芯片方案蓝牙5.3模块
关于远程预付费电能管理系统
超远距离激光探测器在安防领域的应用优势
5G应用在电力行业需解决的两个难题
为检验棉花品级提供良好公检实验室环境的传感器
区块链开发公司AMIS宣布其共识算法将被摩根大通的以太坊区块链采用
专网通信助推大型体育赛事正常进行
农业四情监测设备的具体介绍
外媒传谷歌将推出两款Nexus智能手表
典型的锂离子电池充电策略方案解析
如何快速解决MCU启动异常的问题
fireflyFace-RK3399主板LED灯介绍
你有没有发现你身边的物联网
大型电容器替代备用电池-Large Capacitor Re