函数重载
- 定义:
函数名相同,参数类型、参数数量或者参数顺序不同
int sum(int a, int b) {
return a + b;
}
int sum(int a, int b, int c) {
return a + b + c;
}
-
本质:
采用name mangling技术或者name decoratin技术- name mangling技术
a.C++编译器默认会对符号名(变量名、函数名)进行改编、修饰,有些地方翻译为“命名倾轧”;b.重载时会生成多个不同的函数名,不同编译器(MSVC、g++)有不同的生成规则
- name mangling技术
注意点
a.返回值类型与函数重载无关
b.调用函数时,实参的隐式类型转换可能会产生二义性
extern
- 被
extern "C"
修饰的代码会按照C语言的方式编译 - 如果函数同时有声明和实现,
要让函数声明被 extern "C" 修饰
,函数实现可以不用
extern "C" int sum(int a, int b);
int sum(int a, int b) {
return a + b;
}
- 由于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 <iostream>
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"
,否则不加