开发者学堂课程【你的第一门 C 语言课:内联函数和一些鲜为人知的技巧】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/444/detail/5490
内联函数和一些鲜为人知的技巧
目录:
一、 内联函数
二、 #和##
三、 可变参数
举例:
#include
int square(int x) ;
int square(int x)
{
return x * x;
}
int main(void)
{
int i=1;
while (i <= 100)
{
printf("%d
的平方是
%d
\
n", i-1, squae(i++));
}
return 0;
}
#include
#
define SQUARE(x)((x)*
(
x))
int main(void)
{
int i=1;
while (i <= 100)
{
printf("%d
的平方是
%d
\
n", i-1,
(
(i++)* (i++));
}
return 0;
}
一、内联函数
引入内联函数来解决程序中函数调用的效率问题
所以我们应该把所有的函数都写成内联函数?
内联函数虽然节省了函数调用的时间消耗,但由于每一个函数出现的地方都要进行替换,因此增加了代码编译的时间。另外,并不是所有的函数都能够变成内联函数。
现在的编译器也很聪明,就算你不写 inline,它也会自动将一些函数优化成内联函数。
总结:编译器比你更了解哪些函数应该内联哪些不能内联,所以这个知识点你只需要知道就好。
二、#和##
#和##是两个预处理运算符。
在带参数的宏定义中,#运算符后面应该跟一个参数,预处理器会把这个参数转换为一个字符串。
##运算符被称为记号连接运算符,比如我们可以使用##运算符连接两个参数。
#include
#define STR(s) # s
int main (void)
{
printf
(
"%d\n", STR(FISHC);
return 0;
}
#include
#define STR(s) # s
int main(void )
{
printf(STR(Hello %s num = %d), STR(FishC),)
return 0;
}
#include
#define TOGETHER(x, y) x ## y
int main (void)
{
printf
(
"%d\n",TOGET(2,50));
return 0 ;
}
三、可变参数
之前我们学习了如何让函数支持可变参数,带参数的宏定义也是使用可变参数的:#define SHOWLIST(..) printf(# __VA_ ARGS__)
其中...表示使用可变参数,__VA_ ARGS__在预处理中被实际的参数集所替换。
#include
#define SHOWLIST(...) printf(# __VA
_
ARGS__)
int main (void )
{
SHOWLIST(FishC, 520,3.14\n);
return 0 ;
}
#include
#define PRINT(format, ...) printf(# format, ## __VA_ARGS__)
int main (void)
{
PRINT(num = %d\n, 520) ;
PRINT(Hello FishC!\n);
return 0;
}