1. 程式人生 > >c++==與c的函式對比(4)

c++==與c的函式對比(4)

與c有區別的函式包括行內函數,函式過載,以及帶預設引數函式之間的不同

行內函數:

在c語言中,利用的是巨集函式來處理頻繁使用的函式

巨集函式:函式是巨集定義
如:#define ADD (a,b) a+b

巨集函式與自定義函式的區別:
巨集函式:在預處理階段就進行替換(用編譯時間換取空間)
自定義函式:格式:int add(int a, int b),要分配空間,在編譯時處理

在c++中行內函數的格式就是在型別名前加上inline
實現方法:將函式的內容搬到主程式中,即不需要跳轉,直接在主程式中順序執行。以空間換取執行時間。
這裡寫圖片描述

函式過載

定義:相同的作用域,如果兩個函式名稱相同,而引數不同,我們把它們稱為過載overload
條件:函式名相同,但形參型別或者形參個數或者形參順序不同或者三者都不同。注意:函式的返回值不能作為函式過載的區別。

在c語言中,只要根據函式名選擇呼叫即可。
在c++中,會連上形參的型別,調用不了c的函式

這裡寫圖片描述

//name managling的意思是名字改編

例項:

#include<iostream>  
usingnamespace std;  


void fun(inta, intb)  
{  
         cout<<"int fun"<<endl;  
}  

void fun(doublea, doubleb)  
{  
         cout<<"double fun"<<endl;  
}  

//extern "C"表示不進行名字改編,否則編譯的時候過載函式編譯器會對其名字進行改編  
#ifdef__cpluscplus extern"C" { #endif void fun(inta) { cout<<"xxxx"<<endl; } void fun2(doublea) { cout<<"yyyy"<<endl; } #ifdef__cpluscplus } #endif int main(void) { fun(3,4); fun(3.3, 4.4); fun(3
); return 0; }

用extern c,在c++編譯器中呼叫c的函式,並製作靜態庫:

#ifdef __cplusplus
//
gcc -c main.c
//把程式碼編譯為目標檔案形式
ar rcs libadd.a main.o
//使用工具ar建立一個存檔檔案
g++ demo.cpp -/add -L.
//編譯程式時把程式和liberr.a連結起來

帶預設引數的函式

這裡寫圖片描述