1. 程式人生 > >C++:函式的過載、inline函式、C/C++相互呼叫

C++:函式的過載、inline函式、C/C++相互呼叫

一、過載(overloading) :函式名字相同,而引數不同。返回型別可以相同也可以不同。     

若有題目為:實現兩個數相加,一般我們都會想到如下程式碼:

int Sum(int a,int b)
{
    return a+b;
}

但事實我們考慮並不全面,因為並沒有給出要求是實現兩個整型數相加,我們還需要考慮double、float等等其他型別,需要全面考慮,但之前在c語言中不允許實現如下程式碼 :

int Sum(int a,int b)//?[email protected]@[email protected]
{ return a+b; } doubel Sum(doubel a,double b)//?[email protected]@[email protected] { return a+b; }

但在c++中我們可以實現,原因是因為C語言和C++的符號生成規則不同

符號生成規則:?函式名稱@@Y呼叫約定 返回值型別 形參型別 形參型別@Z

                函式返回值

                函式名稱

                形參列表:形參型別、個數、順序

int Add(int, int);		// [email protected]@[email protected]
double Add(int, int);		// [email protected]@[email protected]
double Add1(int, int);	        // [email protected]
@[email protected] double Add1(double, double); // [email protected]@[email protected] double Add1(double, double, double);// [email protected]@[email protected] double Add1(double,int); //[email protected]@[email protected] double Add1(int, double); //[email protected]@[email protected]

過載特點:

              1.不能使編譯器產生二義性

               2.不依賴返回值

               3.三要素:同作用域、同名、引數不同

二、inline行內函數:編譯階段,在呼叫點直接將程式碼展開

inline int Sum(int a, int b)//_Sum_int_int .text  本檔案
{
	return a + b;
}

1.行內函數和static修飾的函式的區別:

共同點:都是本檔案可見;

不同點:行內函數沒有棧幀的開闢和清理的開銷;

               static修飾的函式開棧和清棧的開銷;

2.優點:提高效率;

3.缺點:以程式碼膨脹為代價,空間浪費大;

建議適用內聯的情況:函式程式碼的執行開銷小於函式程式碼的開棧、清棧開銷

4.注意事項:

            1.寫在標頭檔案;

            2.只在release版本生效,debug版本不生效,依舊有開棧清棧過程;

            3.並不是所有函式都能寫成內聯,例如:遞迴、while、switch不可以;

            4.基於實現,不是基於宣告的,若加在宣告中是無效的。

三、C/C++的相互呼叫

1.C++呼叫C方法:用 extern "C" (其包含的程式碼以C語言處理)宣告包含

extern "C"
{
    extern int Sum(int, int); 
}

 

2.C呼叫C++方法:用 extern "C" (其包含的程式碼以C語言處理)將程式碼包含,分兩種情況

         ①:C++能修改:在.cpp檔案中新增extern宣告

extern "C"
{
     int Sum(int a, int b)
     {
          return a+b;
     }
}

         ②:C++不能修改:新增中間層檔案

//新建一個.cpp
extern int Sum(int, int);
extern "C"
{
	int MySum(int a, int b)
	{
		return Sum(a, b);
	}
}

判斷C++是否能修改:

#ifdef __cplusplus//如果巨集定義,C++會編譯好,C未定義

extern "C"
{
#endif
    int Sum(int a, int b)
    {
	return a + b;
    }
#ifdef __cplusplus
}
#endif