如果不是机缘巧合,当年转到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系列语言的一大宝藏,好好挖掘,说不定可以挖出很多宝贝来。

C语言函数形参添加默认值相关推荐

  1. php函数形参,PHP中的函数形参的默认值

    摘要: 本文为PHP函数形参默认值笔记 简单介绍形参可以设定默认值.形式为:$形参名 = 某值. 设定默认值的形参,只能放在没有设定默认值的形参的后面(右边). 设定了默认值的形参对应的实参可以不提供 ...

  2. c/c++教程 - 2.3 函数的提高 函数的形参列表默认值 占位参数 函数重载

    3. 函数的提高 目录 3. 函数的提高 3.1 函数的默认参数 3.2 函数占位参数 3.3 函数重载 (重要) 相关教程 3.1 函数的默认参数 C++中,函数的形参列表中的形参是可以有默认值的. ...

  3. C++中函数参数的默认值

    文章目录 1 C++中函数参数的默认值 1.1 C++中函数参数的默认值 1.2 函数默认参数的规则 2 函数占位参数 2.1 函数占位参数 2.2 函数占位参数的意义 1 C++中函数参数的默认值 ...

  4. c语言子函数返回值,C语言函数说明与返回值

    在学习C语言函数以前,我们需要了解什么是模块化程序设计方法. 人们在求解一个复杂问题时,通常采用的是逐步分解.分而治之的方法,也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解.程序员在 ...

  5. python函数——字典设置默认值 setdefault()

    文章目录 setdefault()描述 setdefault()用法 setdefault()示例 python函数 系列目录:python函数--目录 setdefault()描述 Python 字 ...

  6. ES6新特性之函数优化-参数默认值

    函数优化 在ES6中,对函数的操作做了优化,使得我们在操作函数时更加的便捷. 函数参数默认值 在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法: function add(a , b) ...

  7. ES6新特性_ES6函数参数的默认值设置---JavaScript_ECMAScript_ES6-ES11新特性工作笔记011

    然后我们再去看,es6中的函数参数的默认值的设置. 可以看到上面我写了个函数,然后 我们调用一下这个函数,并且打印了结果. 然后我们去看,如果我们调用这个函数的时候不写第3个参数 那么,可以看到得到的 ...

  8. js 的函数参数的默认值问题

    js函数参数设置默认值 php有个很方便的用法是在定义函数时可以直接给参数设默认值,如: function simue ($a=1,$b=2){   return $a+$b; } echo simu ...

  9. [转载] python函数——字典设置默认值get() 与 setdefault()区别

    参考链接: Python字典dictionary | setdefault方法 文章目录 示例代码总结 python函数 系列目录:python函数--目录 在python 中 get()以及setd ...

最新文章

  1. 介绍 Saltstack批量管理文件和计划任务
  2. android异常相机处理器,Cordova Android Camera-提供非法参数异常
  3. codevs 1376 帕秋莉•诺蕾姬
  4. C语言中自动变量栈的分配
  5. C#中将list进行序列化并使用SharpZipLib进行压缩
  6. 《自卑与超越》读书笔记(part2)--生活的不确定性正是我们希望的来源
  7. maven依赖管理_依赖管理和Maven
  8. 解决ListView 缓存机制带来的显示不正常问题
  9. 如何将32 x 32像素图标转换为16 x 16像素值的图标
  10. std::deque简单使用
  11. wpf 如何实现窗口浮动_如何实现工作表数据与UserForm窗口的交互,显示第一条记录...
  12. C# string byte[] Base64 常用互相转换
  13. NeoKylin-Server使用docker部署跨主机redis集群
  14. apache 二级域名设置完整步骤
  15. 【第十六篇】Flowable事件之结束事件
  16. R语言使用gbm包的gbm函数拟合梯度提升机回归模型:使用predict函数和训练好的模型进行预测推理、计算回归模型的评估指标MAE、MSE、RMSE、R方等指标
  17. 基于领域模型的微服务划分--实战案例解析
  18. UIView相对坐标转换
  19. 计算机工程师自荐信英语作文,工程师英文求职信范文
  20. kubernetes 调用 rook 作后端存储

热门文章

  1. Ubuntu安装Anaconda详细步骤
  2. 如何使用Keil uVision2软件调试单片机程序
  3. 碎片化时间,到底如何利用?
  4. 预训练模型mlm阅读理解任务
  5. SSL案例:湖北、厦门、青岛电子税务局HTTPS证书应用
  6. C# Excel 为图表添加趋势线、误差线
  7. 程序运行时崩溃生成崩溃文件(Windows Linux)
  8. 获取当前PHP运行环境是否cli模式
  9. Maya 色彩空间不能更改
  10. vue-router3 源码注释系列 /src/util/query.js