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