以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16637890.html


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

最新文章

  1. 十连测Day1 题解
  2. USB Keyboard Recorder
  3. oracle 金额格式化
  4. Mac OS 中设置VPN(pptp连接方式)
  5. iOS7隐藏顶部状态栏
  6. SSO系统的分析与架构
  7. ueditor使用代码高亮的方法
  8. oracle之Flash Recovery Area全面介绍 (转载)
  9. NPOI导出多张图片到Excel
  10. sql注入工具sqlmap使用参数说明
  11. VR全景智慧城市:360全景市场需要背景及其优势~
  12. jvm内存模型的理解
  13. kafka学习笔记——基本概念与安装
  14. Android为TV端助力 事件分发机制
  15. 1024. Video Stitching
  16. centos6安装python3.6.4
  17. Maven之基本概念及特性的基本介绍
  18. 扩展欧几里得 hdu 1576
  19. C++ template —— 函数对象和回调(十四)
  20. Python3基础 set 删除list中的重复项

热门文章

  1. 我的开源之路:耗时 6 个月发布线程池框架,GitHub 1.7k Star!
  2. BUUCTF-RAR
  3. React项目中 使用 CSS Module
  4. 我熬夜开发了一款简约实用、支持多平台的Markdown在线编辑器(开源)
  5. SAP Easy tree
  6. 解开XAML的邪恶面纱
  7. Mybatis-Plus介绍
  8. NTT 学习笔记
  9. go-zero微服务实战系列(十、分布式事务如何实现)
  10. 2020 CSP-J 初赛解析