一、extern
1、同一文件
在.c或者.cpp文件中,可能有多个函数和变量。
以main函数为例,
- 在
main函数内部定义的为局部变量/局部函数,只在函数体内生效; - 在
main函数外部定义的为全部变量/全部函数,(当然也不能定义在其他函数体内),在本文件都生效,但是作用范围只在定义位置到结束,如果之前有函数要使用该变量会出错,那怎么使用呢?
就是要使用extern关键字!!!
如图所示,定义的m,这样在main函数里cout<<m使用会报错,
在使用它之前添加
extern int m;后则可以正常使用,意思就是,这个变量已经在别处定义过。同样这样也是可以的,把
extern int m;在main函数之前。
同样f函数也一样,只不过我们只需把函数体写在前面,无需显式加上extern;
2、不同文件
事实上,我们经常会创建多个.cpp和多个.h文件,并在main函数包含其他的头文件就可以调用其他的函数。但是我们发现,一般都把函数声明放在.h,函数定义放在.cpp内,这是为什么呢?
这是因为在main函数文件内#incude其他文件后,只能找到在被include文件的.h内的变量和函数,而无法找到.cpp内的变量和函数,而直接#incude"test.cpp"又会出错。
这就需要extern关键字了;
如图,
在solution的.cpp里声明并初始化的变量,如果要在另一个.cpp使用它(不是仅仅重名),就需要添加extern说明该变量已经被定义过。
二、inline函数
我们定义函数的作用就是为了提升代码的复用性,但是在某些场合下,为了节省函数调用的开销,从而提升函数执行的效率,内联函数是个选择;
1、内联函数与一般函数的区别
- 1)内联含函数比一般函数在前面多一个inline修饰符。
- 2)内联函数是直接复制“镶嵌”到主函数中去的,就是将内联函数的代码直接放在内联函数的位置上,这与一般函数不同,主函数在调用一般函数的时候,是指令跳转到被调用函数的入口地址,执行完被调用函数后,指令再跳转回主函数上继续执行后面的代码;而由于内联函数是将函数的代码直接放在了函数的位置上,所以没有指令跳转,指令按顺序执行。
- 3)一般函数的代码段只有一份,放在内存中的某个位置上,当程序调用它是,指令就跳转过来;当下一次程序调用它是,指令又跳转过来;而内联函数是程序中调用几次内联函数,内联函数的代码就会复制几份放在对应的位置上
- 4)内联函数一般在
头文件中定义,而一般函数在头文件中声明,在cpp中定义。
2、慎用内联函数
内联是以代码膨胀复制为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。每一处内联函数的调用都要复制代码, 将使程序的总代码量增大,消耗更多的内存空间。因此以下情况不宜使用内联:
- 1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
- 2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
3、使用
我们一般在.h文件中声明函数,并在.cpp中定义(实现)。
内联函数要在.h文件中声明并定义;
以类为例:
- 如果在
class内部直接将函数实现,则相当于在.h文件中声明并定义了该函数,那么编译器会自动转化为inline. - 在类外定义,就需要在.h文件内,class声明后直接定义该函数并添加关键字inline,而不是在.cpp中定义该函数.
总结
-
extern:告诉编译器该变量已经在别处声明过。 -
inline:使用这个函数时将复制代码,而不是函数调用;