首页 > 其他分享 >C语言怎么给函数添加形参的默认值

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

时间:2022-08-30 00:23:05浏览次数:101  
标签:__ 形参 val default C语言 fun 默认值

以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「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系列语言的一大宝藏,好好挖掘,说不定可以挖出很多宝贝来。

标签:__,形参,val,default,C语言,fun,默认值
From: https://www.cnblogs.com/englyf/p/16637890.html

相关文章

  • C语言 紧跟printf之后的while(1)
    当printf()后面紧跟while(1)时,printf的内容有时候能打印出来,有时候打印不出来原因是,printf()中的内容在缓冲区里,你得加上‘\n’或者使用fflush(stdout)才能让它......
  • C语言:命令行参数
    命令行参数在图形界面普及之前都使用命令行界面。DOS和UNIX就是例子。Linux终端提供类UNIX命令行环境。命令行(commandline)是在命令行环境中,用户为运行程序输入命令的行......
  • C语言猜数字游戏
    C语言猜数字游戏题目十:猜数字游戏1.设计要求:有一定的容错功能,界面友好,功能齐全。2.设计提示:猜数字游戏规则:a)一个四位数,各位上的数不重复,从1到9。b)按以下......
  • C语言学习进程(翁恺)
    1.0——C的基本结构及语句1.1——循环(loop)1.2——多路分支switch-case1.3——break&continue1.4——practice1  C的框架#include<stdio.h>intmain()......
  • C语言常用编译选项
    目录编译选项-Wall-Wextra-Werror-Werror=implicit-function-declaration-Werror=unused-variable参考编译选项当-Wxx时,指的是,针对某个类型产生告警,特殊的-Wall是对所有......
  • C语言中的SDL库有啥用?
     SimpleDirectMediaLayer(SDL)isacross-platformdevelopmentlibrarydesignedtoprovidelowlevelaccesstoaudio(声音),keyboard(键盘),mouse(鼠标),joystick(操纵......
  • C语言基本算术运算
    基本算术类型C运算符合表达式负号第一优先级(一元运算符)乘除求余第二优先级(二元运算符)加减第三季优先级(三元运算符)注意:1/2的结果是01.0/2的结果是0.5(整型除法和浮点......
  • C语言发展历程及开发环境
                         ......
  • C语言字符串处理函数 gets()和fgets()的区别及使用
    字符串函数(Stringprocessingfunction)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数。本文主要介绍C语言中符串处理函数gets()和fgets()的区别使用方法,......
  • C语言重定向输入:txt文件内容是中文,重定向输入显示乱码的原因
    一.txt文件中的内容是中文,重定向输入显示乱码原因:是因为文本文件的编码和和编译器的不一致导致的.我文本文件用的编码是UTF-8,而编译器是ANSI,不匹配,所以输出乱码.文本......