内联函数
内联函数: 被内联编译的函数
1.在函数定义的前面加上 inline 关键字,在函数声明前加inline是无效的
2.内联函数 在编译完之后的程序中是不存在的,在编译的过程中,会用内联函数的函数体
去替换到函数被调用的地方。
3.inline 是一种请求,并不会一定成功
设置内联函数的要求
1.函数中不要有任何复杂的循环语句
2.函数中不要有复杂的条件判断
3.函数体不要太长,不要超过5行
4.函数体编译后是不存在的,所以内联函数是没用地址的,不能作为回调函数来使用
推荐用内联函数来代替宏函数
宏函数在预处理期间进行处理,做的是完全替换,可以节省函数的跳转、入栈、出栈等的开销
提升程序运行的效率,用空间换取时间
宏函数的使用可能不会达到预期的效果 宏函数不会对参数类型进行检查
宏函数和内联函数的比较事例
#define ADD(x, y) x+y
inline int add(int a, int b)
{
return a + b;
}
int main()
{
printf("2+3 = %d\n", ADD(2,3)*ADD(2,3)); //2+3*2+3==2+6+3==11,单纯的替换
printf("2+3 = %d\n", add(2,3)*add(2,3)); //(2+3)*(2+3)==5*5==25,将函数体替换了过来
return 0;
}
默认参数
默认参数是函数参数的默认值,当不给这个参数传参的时候使用这个参数的默认值
如果一个函数的某个参数有默认值,则该参数右边的所有参数都要有默认值
/*例void func1(int a, int b = 10, int c);
func1(1,2)
调用函数的时候,参数2不知道该给谁
*/
{
return a + b;
}
int add1(int a, int b = 10, int c = 20)
{
return a + b + c;
}
int main()
{
printf("a + b = %d\n", add2(2,3)); // 2+3=5
printf("a + b = %d\n", add2(2)); // 2+10 = 12
printf("a + b + c = %d\n", add1(1,2,3)); // 1+2+3 = 6
printf("a + b + c = %d\n", add1(1,2)); //1+2+20 = 23
printf("a + b + c = %d\n", add1(1)); //1+10+20 = 31
return 0;
}
//占位参数: 形参只有类型没有变量名, 调用的时候必须要给占位参数赋值,虽然不用占位参数
int add3(int a, int)
{
return a;
}
//占位参数可以和默认参数一起使用
int add4(int a, int = 0)
{
return a;
}
int main()
{
printf("a + b = %d\n", add3(1,2));// 1
printf("a + b = %d\n", add4(1)); // 1
return 0;
}