函數(shù)重載
- 定義:
函數(shù)名相同详囤,參數(shù)類型桨武、參數(shù)數(shù)量或者參數(shù)順序不同
int sum(int a, int b) {
return a + b;
}
int sum(int a, int b, int c) {
return a + b + c;
}
-
本質(zhì):
采用name mangling技術(shù)或者name decoratin技術(shù)- name mangling技術(shù)
a.C++編譯器默認(rèn)會對符號名(變量名肋拔、函數(shù)名)進行改編锈津、修飾呀酸,有些地方翻譯為“命名傾軋”;b.重載時會生成多個不同的函數(shù)名琼梆,不同編譯器(MSVC性誉、g++)有不同的生成規(guī)則
- name mangling技術(shù)
注意點
a.返回值類型與函數(shù)重載無關(guān)
b.調(diào)用函數(shù)時,實參的隱式類型轉(zhuǎn)換可能會產(chǎn)生二義性
extern
- 被
extern "C"
修飾的代碼會按照C語言的方式編譯 - 如果函數(shù)同時有聲明和實現(xiàn)茎杂,
要讓函數(shù)聲明被 extern "C" 修飾
错览,函數(shù)實現(xiàn)可以不用
extern "C" int sum(int a, int b);
int sum(int a, int b) {
return a + b;
}
- 由于C、C++編譯規(guī)則的不同煌往,在C倾哺、C++混合開發(fā)時轧邪,可能會經(jīng)常出現(xiàn)下邊的操作:
C++在調(diào)用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;
}
如上我們需要在每一個調(diào)用C語言的.cpp
文件都寫extern "C"
,這樣是很麻煩的一件事兒却邓。那么硕糊,有沒有更好的方式呢?C++
中定義的__cplusplus
這個宏給了我們啟發(fā)腊徙,我們可以在.h
文件中做文章简十,當(dāng)編譯器檢測到是C++
文件的時候就加上extern "C"
,否則不加
Sum.h.png
main.cpp.png