天天看點

extern,C,C++混合程式設計

1: C,C++使用宏定義的好處: 宏定義使用預處理器實作,沒有參數壓棧,代碼生成等一系列的操作,是以他的效率很高。 缺點: 使用時所作的隻是預處理器中符号表的簡單替換,是以不能實作參數的有效性檢測,也就不能享受C++編譯器嚴格類型檢查的好處。另外它的傳回值也不能被強制轉換為可以的合适類型,是以在使用上就存在着一定的隐患。另外當C++的操作或者表達式涉及到保護成員或者私有成員時,就不能使用宏定義來實作(因為無法将this指針放在合适的位置) 2: 使用inline的目的: 繼承宏定義的優點,同時避開宏定義的缺點。函數的代碼被直接放在符号表中,在使用時被直接替換,沒有了調用的開銷,效率也很高。inline函數也是一個真正的函數,編譯器在調用一個inline函數時會檢查它的類型,保證調用正确,進而避免了使用的局限性和隐患性。inline函數可以作為一個類的成員函數。 inline函數一般使用在函數的内容非常簡單的情形。 3: C++中函數的重載 C++中函數編譯後變成 _function_int_float 是以C++根據函數的名字和參數類型來識别函數,進而實作了函數的重載 但是在C語言中函數編譯後變成了_function,沒有函數的參數,是以兩者之間函數的編譯形式不相同,在C++中調用C函數,需要特别的聲明 extern “C” { #include"a.h" #include"b.h" //或者直接寫上函數的聲明; void int(float); } 再加一句,C,C++都隻不對函數的傳回類型進行檢查。 4:函數重載中要注意的問題 當數字作為函數的參數輸入時候,因為數字本身并沒有類型,此時要進行隐式類型轉換,但是對于某些重載函數來說,就會出現錯誤

void fun1(int xx); void fun1(float yy); void main() { fun1(1); //OK fun1(float(1.0));//Error fun1(0.0123); //Error

} void fun1(int zz) { printf("function int\n"); } void fun1(float zz) { printf("function float\n"); }

經過測試其實可以發現原因很簡單,對于字面值 1 其預設的類型是int,是以就可以void fun1(int xx)是其最佳比對的。而對于1.0,0.0123這樣的數,編譯器會将他們當成double類型的數字,那麼在函數的比對過程中,可以将其轉換成int類型的,或者float類型的,這兩種隐形轉換都不是最佳比對,是以就會出現函數調用的二義性。如果此時再定義一個這樣的函數,void fun1(double)類型的函數,再調用 fun1(float(1.0)); fun1(0.0123);  這樣就不會出錯了。