写点什么

C 语言怎么给函数添加形参的默认值

作者:englyf
  • 2022-12-03
    广东
  • 本文字数:979 字

    阅读完需:约 3 分钟

C语言怎么给函数添加形参的默认值

以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「englyf」https://juejin.cn/post/7135126256181313567




如果不是机缘巧合,当年转到 C++之后,恐怕很难再有机会还写 C 的代码。面向对象在现代 coding 中,就像圣经一样,在码农的口中自带光环,code 起来左一个语法糖,右一个范式编程,各种眼花缭乱。主业要是还用 C,都不好意思出去吹牛逼,要啥特性就没啥特性,随便一聊,大伙亲切地给你起一个名号--骨灰级码农,就问你尴尬不?


嗯,最近在阅读芯片原厂的行业应用方案例程代码时,发现有趣的是,里边除了脚本,所有工程代码一律是用 C 语言。原本还想着观摩一下杂技团表演,结果是一本漫画走天涯哈,真是史前怪兽出没。不过,代码很精巧,值得一读。十足的开局给你一把刀,防身工具只能说是简陋,结果玩出了屠龙刀的花样。


其中看到了给函数添加形参的默认值,猛一惊觉,这在高级语言使用过程中太常见了,但 C 语言本身是不支持的这种玩法的。


那么用什么办法实现?


其中一个方法就是用宏定义绕过函数的限制。


下面看代码,听我徐徐道来。


先定义的一个被执行的函数


void _fun(int val){    printf("fun input val:%d", val);}
复制代码


但是我想在调用函数时不输入参数,希望系统输入默认的参数值。


定义一个可变参的宏定义


#define fun(...)    _fun((default_val, ##__VA_ARGS__));
复制代码


输入给_fun 的参数形式上是(default_val, ##__VA_ARGS__),其中的default_val就是我们设定的参数默认值,默认值类型应该和_fun 的形参类型一致。


调用 fun 宏定义时,如果没有输入参数,##会把(default_val, ##__VA_ARGS__)变成(default_val),那么实际输入给_fun 的参数就变成了(default_val);如果有输入参数,比如数值 A,由于逗号运算符的运算优先级会把逗号后边的值输出返回,(default_val, ##__VA_ARGS__)变成(A),那么实际输入给_fun 的参数就变成了(A)


看一下实际的例子,由于_fun 的实际形参类型为 int 类型,那么把default_val(形参默认值)改为 123 测试一下


#include <stdio.h>
#define fun(...) _fun((123, ##__VA_ARGS__));
void _fun(int val){ printf("fun input val:%d", val);}
int main(){ fun(); printf("\r\n---\r\n"); fun(321);}
复制代码


执行结果


fun input val:123---fun input val:321
复制代码


好了,看了输出结果,效果还是蛮不错的。


宏定义是 C 系列语言的一大宝藏,好好挖掘,说不定可以挖出很多宝贝来。

发布于: 刚刚阅读数: 7
用户头像

englyf

关注

我的微信公众号 englyf 2018-06-01 加入

欢迎关注我的微信公众号 englyf 一起交流学习,每周至少更新一篇各类原创技术笔记,闲来也听我嗑唠嗑唠……

评论

发布
暂无评论
C语言怎么给函数添加形参的默认值_c_englyf_InfoQ写作社区