一、extern

1、同一文件

.c或者.cpp文件中,可能有多个函数和变量。
main函数为例,

  • main函数内部定义的为局部变量/局部函数,只在函数体内生效;
  • main函数外部定义的为全部变量/全部函数,(当然也不能定义在其他函数体内),在本文件都生效,但是作用范围只在定义位置到结束,如果之前有函数要使用该变量会出错,那怎么使用呢?
    就是要使用extern关键字!!!

extern和inline的用法
如图所示,定义的m,这样在main函数里cout<<m使用会报错,

extern和inline的用法在使用它之前添加extern int m;后则可以正常使用,意思就是,这个变量已经在别处定义过。
extern和inline的用法同样这样也是可以的,把extern int m;main函数之前。

同样f函数也一样,只不过我们只需把函数体写在前面,无需显式加上extern

2、不同文件

事实上,我们经常会创建多个.cpp和多个.h文件,并在main函数包含其他的头文件就可以调用其他的函数。但是我们发现,一般都把函数声明放在.h,函数定义放在.cpp内,这是为什么呢?

这是因为在main函数文件内#incude其他文件后,只能找到在被include文件的.h内的变量和函数,而无法找到.cpp内的变量和函数,而直接#incude"test.cpp"又会出错。

这就需要extern关键字了;
如图,
extern和inline的用法
在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的用法

总结

  • extern:告诉编译器该变量已经在别处声明过。
  • inline:使用这个函数时将复制代码,而不是函数调用;

相关文章:

  • 2021-07-14
  • 2021-09-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-10-09
  • 2021-05-24
  • 2021-11-08
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案