c++中函数重载和extern

  • 1. 函数重载

    • 重载规则

  1. 函数名相同

  2. 参数个数不同,参数类型不同,参数顺序不同

  3. 返回值类型不作为重载的标准

    • 面试问题

  如果同时定义了两个函数,一个带const,一个不带const,会报错吗?

  回答:不会,两个函数参数不同,相当于函数重载。

    • 重载底层实现

  C++利用name mangling(命名倾轧)技术,来改变函数名,区分参数不同的同名函数。

  举例说明:若有两个函数:foo(int a), foo(double a)C++在底层进行编译时,会将其编译成两个不同的函数,如foo_i, foo_d等,底层实质上是不同的,只是我们看起来是相同的。

  • 2. extern 

  extern用来修饰全局变量(通常我们理解中,全局变量本身是全局可用的,但是由于C语言是单文件编译,并且编译时自上而下的,故不是本范围内定义的变量需要用extern进行申明),对于上述的解释如下

       


  即extern可以置于变量或函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他文件中寻找其定义。

    • extern修饰变量或函数时

    如在头文件中extern int g_Int,其作用是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本文件或者其他文件中使用。其是一个声明而不是定义。也就是说,B模块(编译单元)要是引用(编译单元)A模块中定义的全局变量或函数时,其只要包含A模块的头文件即可。在编译阶段,B模块即使找不到该函数或变量,也不会报错,会在连接时从模块A生成的目标代码中找到此函数或变量

    • extern C

    extern “c” 主要是用来避免命名倾轧的。对于一个函数来说,命名倾轧是根据声明来进行倾轧的,如果声明被倾轧,则调用时倾轧版本;如果声明为非倾轧版本,调用也是未倾轧版本。因此,对于一个函数来说,其要么被倾轧,要么不被倾轧。如果声明和定义其中一个被倾轧,则其最终会导致无法链接。

    C++是完全兼容C的,如果C语言是以源代码的形式出现的,重新编译是没有问题的,如果C语言是以标准库的形式出现的,由于调用的库是未倾轧的版本,其定义是未倾轧的。但头文件在C++中,使用过程中会被倾轧,导致无法链接,因此每个C标准库中都会加上extren C”避免命名倾轧。(即为什么C++完全兼容C

            

原文地址:https://www.cnblogs.com/Cucucudeblog/p/13363006.html