编程语言应用

首页 » 常识 » 预防 » 既然C语言无所不能,那么它也能定义带默
TUhjnbcbe - 2023/4/22 19:59:00

使用C++开发过程序时,定义函数可以指定默认参数,例如voidfun(intx,inty=3);在调用fun()时第二个参数可以不传递,此时fun()函数默认第二个参数等于3,例如f(1)就相当于f(1,3)。这是一个很好用的特性,那么在C语言程序开发中,是否也可以定义带“默认参数”的函数呢?

C语言程序开发中,是否也可以定义带“

有“默认参数”的C语言函数

首先应该清楚,目前C语言还没有原生支持带默认参数的函数,也就是说下面这样的C语言代码是非法的:

voidfun(intx,inty=3){

returnx+y;

}

fun(1);//不等价于fun(1,3)

但是,C语言作为一门极其灵活的编程语言,又的确可以借助其他基本语法实现这样的需求。不过要在C语言中定义带“默认参数”的函数可能略微有些繁琐,当然了,方法可能不止一种,本文不打算从枯燥的理论层面讨论这些方法,而是给出一个实例,希望能够起到抛砖引玉的作用。

希望能够起到抛砖引玉的作用

假设我们希望在某段C语言程序中定义一个带默认参数的函数,它可以接收两个参数,并将之打印出来:

doublef(inti,doublex){

printf(i=%d,x=%0.2f\n,i,x);

returnx;

}

现在期望调用f时,如果不显式指定参数,f的两个默认参数为(i=8,x=3.14),例如:

f();//输出i=3,x=3.14

f(1);//输出i=1,x=3.14

f(2,6.28);//输出i=2,x=6.28

C语言没有定义“默认参数”函数的原生

C语言自然没有支持这种需求的原生语法,但是为了实现这样的目的,可以定义下面这个结构体,请看相关C语言代码:

typedefstruct{

inti;

doublex;

}f_args;

接着,定义f_base()函数,它的C语言代码实现和f()是一样的,目的是让f_base()函数具有期望的f()函数功能。然后再定义一个函数将f_base()封装,相关C语言代码如下,请看:

将f_base()封装

显然,从上述C语言代码来看,var_f()函数实现了默认参数的功能。现在再定义一个带可变参数的宏,这样一来,调用者就不必知道结构体f_args的结构了:

#definef(...)var_f((f_args){__VA_ARGS__})

现在我们就在C语言中实现了带“默认参数”的方法,全部C语言代码如下,请看:

全部C语言代码

上述C语言代码在main()函数中调用f()函数,并分别传递了不同的参数,编译并执行之,得到如下结果:

#gcct.c

#./a.out

i=3,x=8.00

i=1,x=2.30

i=2,x=3.14

i=8,x=9.20

最后

可见,C语言是一门极其简洁灵活的编程语言,其他编程语言中一些好用的特性,可能C语言没有原生语法支持,但是我们却可以组合其他基本语法,自己实现这些好用的特性。

不过应该注意,有件事是行不通的——f(0),因为上述实现我们无法在var_f()中区分“0”究竟是调用者传递的,还是默认值,不过我相信聪明的读者应该能够想到解决这样的问题的方法。

点个赞再走吧

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就

1
查看完整版本: 既然C语言无所不能,那么它也能定义带默