网站设计制作一条龙免费,百度seo优化培训,一个网站备案两个域名吗,手机网站怎么做C内联函数 一、内联函数
1、C中的const常量可以替代宏常数定义#xff0c;如#xff1a;
const int A 3; #define A 3
C中是否有解决方案替代宏代码片段呢#xff1f;#xff08;替代宏代码片段就可以避免宏的副作用#xff01;#xff09; 2、C中推荐使用内联函数…C内联函数 一、内联函数
1、C中的const常量可以替代宏常数定义如
const int A 3; #define A 3
C中是否有解决方案替代宏代码片段呢替代宏代码片段就可以避免宏的副作用 2、C中推荐使用内联函数替代宏代码片段
C中使用inline关键字声明内联函数
内联函数声明时inline关键字必须和函数定义结合在一起否则编译器会直接忽略内联请求。 #include iostreamusing namespacestd;#define MIN(a,b) ((a) (b) ? (a) : (b))inline int myfunc(inta, int b)
{return a b ? a : b;
}int main(void)
{int a 1;int b 3;//int c myfunc(a, b);int c MIN(a, b);printf(a %d\n, a);printf(b %d\n, b);printf(c %d\n, c);return 0;
} 说明1必须inline intmyfunc(int a,int b)和实现的地方写在一块。
说明2C编译器可以将一个函数进行内联编译被C编译器内联编译的函数叫做内联函数内联函数在最终生成的代码中是没有定义的C编译器直接将函数体插入函数调用的地方内联函数没有普通函数调用时的额外开销(压栈跳转返回)。
说明3C编译器不一定准许函数的内联请求
说明4内联函数是一种特殊的函数具有普通函数的特征参数检查返回类型等内联函数是对编译器的一种请求因此编译器可能拒绝这种请求内联函数由编译器处理直接将编译后的函数体插入调用的地方宏代码片段由预处理器处理进行简单的文本替换没有任何编译过程。
说明5现代C编译器能够进行编译优化因此一些函数即使没有inline声明也可能被编译器内联编译另外一些现代C编译器提供了扩展语法能够对函数进行强制内联如g中的__attribute__((always_inline))属性。
说明6
C中内联编译的限制
不能存在任何形式的循环语句不能存在过多的条件判断语句函数体不能过于庞大不能对函数进行取址操作函数内联声明必须在调用语句之前。 结论 1内联函数在编译时直接将函数体插入函数调用的地方
2inline只是一种请求编译器不一定允许这种请求
3内联函数省去了普通函数调用时压栈跳转和返回的开销 二、默认参数
1、C中可以在函数声明时为参数提供一个默认值 当函数调用时没有指定这个参数的值编译器会自动用默认值代替。
2、只有参数列表后面部分的参数才可以提供默认参数值一旦在一个函数调用中开始使用默认参数值那么这个参数后的所有参数都必须使用默认参数值。 三、函数占位参数
占位参数只有参数类型声明而没有参数名声明一般情况下在函数体内部无法使用占位参数。 四、函数重载
用同一个函数名定义不同的函数当函数名和不同的参数搭配时函数的含义不同。 int func(int x)
{return x;
}int func(int a, int b)
{return a b;
}int func(const char *s)
{return strlen(s);
}int main(intargc, char *argv[])
{int c 0;c func(1);printf(c %d\n, c);c func(1, 2);printf(c %d\n, c);c func(12345);printf(c %d\n, c);return 0;
}函数重载至少满足下面的一个条件 参数个数不同 参数类型不同 参数顺序不同
编译器调用重载函数的准则 将所有同名函数作为候选者 尝试寻找可行的候选函数 精确匹配实参 通过默认参数能够匹配实参 通过默认类型转换匹配实参 匹配失败 最终寻找到的可行候选函数不唯一则出现二义性编译失败。 无法匹配所有候选者函数未定义编译失败。
函数重载的注意事项 重载函数在本质上是相互独立的不同函数静态链编 重载函数的函数类型是不同的 函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。
函数重载与函数指针 当使用重载函数名对函数指针进行赋值时 根据重载规则挑选与函数指针参数列表一致的候选者 严格匹配候选者的函数类型与函数指针的函数类型