C(非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

 

 

如果函数参数有两个,例子如下:

#include <stdio.h>

#define fun(a,...)    _fun(a, (3, ##__VA_ARGS__));

void _fun(int a, int b)
{
    printf("a=%d, b=%d\n", a,b);
}

int main()
{
    fun(1);
    printf("---\n");
    fun(1, 2);

    int x = (3,5); // 括号很重要
    printf("x=%d\n", x);
}

执行结果

a=1, b=3
---
a=1, b=2
x=5

 

posted @ 2024-03-20 21:25  流水灯  阅读(19)  评论(0编辑  收藏  举报