您的位置:首页 > 编程语言 > C语言/C++

C语言 函数默认参数

2016-04-30 14:40 375 查看
这段代码也不知道谁是原创了,知道的话告诉我链接

#include <stdio.h>

#define DEFARG(name, defval) ((#name[0]) ? (name + 0 ) : defval)

int _f1(int i)
{
return 2 * i;
}
#define f1(arg0) _f1(DEFARG(arg0, 0))

int _f2(int i, int j)
{
return i + j;
}
#define f2(arg0, arg1) _f2(DEFARG(arg0, 0), DEFARG(arg1, 1))

int main()
{
printf("%d\n", f1());
printf("%d\n", f1(1));
printf("%d\n", f2(, ));
printf("%d\n", f2(2, ));
printf("%d\n", f2(, 3));
printf("%d\n", f2(4, 5));
return 0;
}


#define DEFARG(name, defval) ((#name[0]) ? (name + 0 ) : defval)

在这里#name[0]中#的作用是把后面的参数转换为字符串,并且[0]取出字符串中的第一个元素

如果name为空格,则#name为”“空字符串,#name[0]为’\0’,表达式为假,此时表达式的值为defval

还有一个疑问为什么是name+0,直接name不可以吗?

当name为空格时,(name+0)就是+0,也就是0

如果是((#name[0]) ? (name ) : defval),当name为空格时,那么最后就好比(a >b) ? : b缺少了一部分,自然是错的

C语言宏定义技巧(常用宏定义)

C语言宏定义中的#,##,#@及\符号的作用

C语言宏高级用法 [总结]

20个C语言中常用宏定义总结

C语言中的参数默认值

宏定义的黑魔法 - 宏菜鸟起飞手册

C语言宏的特殊用法和几个坑
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: