C++: 函数重载(overload)和 extern

函数重载

  1. 定义:
    函数名相同,参数类型、参数数量或者参数顺序不同
int sum(int a, int b) {
    return a + b;
}

int sum(int a, int b, int c) {
    return a + b + c;
}
  1. 本质:
    采用name mangling技术或者name decoratin技术

    • name mangling技术
      a.C++编译器默认会对符号名(变量名、函数名)进行改编、修饰,有些地方翻译为“命名倾轧”;b.重载时会生成多个不同的函数名,不同编译器(MSVC、g++)有不同的生成规则
  2. 注意点
    a.返回值类型与函数重载无关
    b.调用函数时,实参的隐式类型转换可能会产生二义性


extern

  1. extern "C" 修饰的代码会按照C语言的方式编译
  2. 如果函数同时有声明和实现, 要让函数声明被 extern "C" 修饰,函数实现可以不用
extern "C" int sum(int a, int b);

int sum(int a, int b) {
    return a + b;
}
  1. 由于C、C++编译规则的不同,在C、C++混合开发时,可能会经常出现下边的操作:
    C++在调用C语言API时,需要使用extern "C" 修饰,如下:
// C语言:头文件
#ifndef Sum_h
#define Sum_h
 int sum(int a, int b);
#endif /* Sum_h */

// Sum.c文件
#include "Sum.h"
int sum (int a, int b) {
    return a + b;
}

// main.cpp文件
#include 
using namespace std;
// 此处需要extern "C"修饰,否则编译不通过
extern "C" {
    #include "Sum.h"
}
int main(int argc, const char * argv[]) {
    sum(20, 10);
    cout << sum(10, 20) << endl;
    return 0;
}

如上我们需要在每一个调用C语言的.cpp文件都写extern "C",这样是很麻烦的一件事儿。那么,有没有更好的方式呢?C++中定义的__cplusplus这个宏给了我们启发,我们可以在.h文件中做文章,当编译器检测到是C++文件的时候就加上extern "C",否则不加

C++: 函数重载(overload)和 extern_第1张图片
Sum.h.png

C++: 函数重载(overload)和 extern_第2张图片
main.cpp.png

你可能感兴趣的:(C++: 函数重载(overload)和 extern)