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

如果不是机缘巧合,当年转到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);
}
</stdio.h>

执行结果

`
fun input val:123

Original: https://www.cnblogs.com/englyf/p/16637890.html
Author: englyf八戒
Title: C语言怎么给函数添加形参的默认值

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574068/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 操作系统实现-进入内核

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这一次我们正式进入内核,编写相关的内核代码,也就是kernel代码 数据类…

    Linux 2023年6月13日
    097
  • Shell脚本之while read line的用法

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    090
  • 一个老程序员的忠告:你这辈子输就输在以为靠技术就能生存下

    一、 在一个地方工作8小时就是”穷” 1、在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你更不要认为那些从事市场开发,跑腿的人,没有前途。…

    Linux 2023年6月14日
    0113
  • flask 之 请求钩子

    请求钩子 什么是请求钩子? 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码, flask提供了统一的接口可以添加这些处理…

    Linux 2023年6月8日
    095
  • 【C++基础】内存分区模型

    内存分区模型 C++程序在执行时,将内存大致划分为 4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理 全局区:存放 全局变量和 静态变量以及 常量 栈区:由 编译器自动…

    Linux 2023年6月13日
    078
  • KVM http网络加载镜像报错(mount: wrong fs type, bad option, bad superblock on /dev/loop0)

    curl: (23) Failed writing body (7818 != 16384)loop: module loadeddracut-initqueue[579]: mo…

    Linux 2023年6月6日
    0136
  • Linux用户和用户组

    Linux用户和用户组 1.添加新的用户 (用户ID从500开始,0-99系统管理级别、100-499系统预留) useradd 选项 用户名 参数说明 选项: -c commen…

    Linux 2023年6月11日
    082
  • LVM 逻辑卷管理 Logical Volume Management

    管理磁盘、使用磁盘的一种方式的称呼 优势: 1、在不影响数据的情况下, 扩容、缩容 2、支持快照功能, 方便数据备份 LVM工作流程: 磁盘/分区 —> pv(物…

    Linux 2023年6月7日
    0112
  • Redis6.0.5版本配置文件说明(转载)

    Redis版本此文章中Redis版本为6.0.5。 redis-server –versionRedis server v=6.0.5 sha=00000000:0 m…

    Linux 2023年5月28日
    093
  • short, int, long, long long各个类型的范围

    类型名称 字节数 取值范围 signed char 1 -2^7 ~ 2^7-1 -128~+127 short int 2 -2^14 ~ 2^14-1 -32768~+3276…

    Linux 2023年6月8日
    099
  • Shell脚本8种字符串截取方法总结

    Linux 的字符串截取很有用。有八种方法。 假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符。 echo …

    Linux 2023年5月28日
    0136
  • 多线程核心基础

    1 进程和线程 ​ 进程是OS分配资源的最进本的单位,线程是执行调度的最基本单位。分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己的独立空间)。J…

    Linux 2023年6月14日
    0103
  • RPA人力资源简历筛选机器人

    简历自动筛选及分析机器人,支持前程无忧、猎聘 1、自动登录招聘网站 2、自动填充简历筛选条件 3、RPA依次读取所筛选的简历信息 4、自动将简历数据复制到本地文档中 5、完成简历信…

    Linux 2023年6月7日
    095
  • windows 挂载 NFS共享

    实验环境: NFS主机(192.168.18.10):CentOS7.0 软件包:nfs-utils、rpcbind; 客户机(192.168.18.41):windows ser…

    Linux 2023年5月27日
    0200
  • docker –link容器互联

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    092
  • VMware vSphere 7 Update 3 下载

    请访问原文链接:https://sysin.org/blog/vmware-vsphere-7-u3/,查看最新版。原创作品,转载请保留出处。 vSphere 7 Update 3…

    Linux 2023年5月27日
    0101
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球