#define year (365*24*60*60*60*60ul ) 这样才是正确的
宏定义的变量是不占内存空间的,直接替换减少开销,但是变量替换是不进行类型检查;
函数的变量要占用空间、要压栈等操作,就需要很大的开销,但是调用函数时,编译器会检查函数变量的类型是否相同。
内联函数集合普通函数、宏定义的两个优势,它直接就地展开,直接替换,减少开销,同时编译器也会检查变量的类型。但是函数体积要小,不然效率反而很低,至于
原因暂时不详。
6.3、内联函数:对函数就地展开,像宏定义一样,这样减少开销,同时也检查变量的类型。但是必须函数的内部体积小才用这种方式,以达到更好的效率。体积大的函数就作为普通函数。
内联函数通过在函数定义前加inline关键字实现。
* 6.4、条件编译的应用:做一个调试开关。#define DEBUG #undef DEBUG 是注销 DEBUG 宏
#ifdef DEBUG
#define debug(x) printf(x)
#else
#define debug(x)
#endif
6.5、函数:(1)整个程序分成多个源文件,一个文件分成多个函数,一个函数分成多个语句,这就是整个程序的组织形式。这样组织的好处在于:分化问题、便于编写程序、便于分工。
(2)函数的出现是人(程序员和架构师)的需要,而不是机器(编译器、CPU)的需要。
(3)函数的目的就是实现模块化编程。说白了就是为了提供程序的可移植性。
<1>函数书写的一般原则:
第一:遵循一定格式。函数的返回类型、函数名(男女厕所)、参数列表(太多用结构体)等。
第二:一个函数只做一件事:函数不能太长也不宜太短(一个屏幕的大小),原则是一个函数只做一件事情。
第三:传参不宜过多:在ARM体系下,传参不宜超过4个。如果传参确实需要多则考构体打包考虑
第四:尽量少碰全局变量:函数最好用传参返回值来和外部交换数据,不要用全局变量。
<2> 之所以函数能被调用,根本实质是在编译时,检查到了该函数的声明,不是因为函数定义了(当然也要定义才行,只是不是本质)。
6.6、递归函数:自己调用自己的函数,常用举例:阶乘 int jiecheng( int n) 斐波那契数例: f(n)=f(n-1)+f(n-2) n>2的正整数
{ int he(int n)
注意: if(n<1) if(3==n||4==n)
栈溢出:递归函数会不停的耗费栈空间 { {
所以要注意递归不要太多 printf("error\n"); return 1;
收敛性:必须 要有一个终止递归的条件 } }
else if(n>1) else if(n>4)
{ {
return n*jiecheng(n-1); return he(n-1) +he(n-2)
} }
else
{
return 1;
}
}
6.7、函数库:<1>静态链接库其实就是商业公司将自己的函数库源代码经过只编译不连接形成.o的目标文件,然后用ar工具将.o文件归档成.a的归档文件(.a的归档文件又叫静态链接库文件)。
商业公司通过发布.a库文件和.h头文件来提供静态库给客户使用;客户拿到.a和.h文件后,通过.h头文件得知库中的库函数的原型,然后在自己的.c文件中直接调用这些库文件,
在连接的时候链接器会去.a文件中拿出被调用的那个函数的编译后的.o二进制代码段链接进去形成最终的可执行程序。
<2>动态链接库本身不将库函数的代码段链接入可执行程序,只是做个
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33816-10.html
这种东西还用酿吗
十年以后