1. 程式人生 > 其它 >C/C++還能混合程式設計?這讓我事半功倍!

C/C++還能混合程式設計?這讓我事半功倍!

什麼是C/C++混合程式設計?

我們都知道C是一個結構化語言,它的重點在於演算法和資料結構。C程式的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程 (事務)控制)

對於C++,首要考慮的是如何構造一個物件模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取物件的狀態資訊得到輸出或實現過程(事務)控 制

那麼什麼是C/C++混合程式設計?實際上簡單點說C/C++混合程式設計就是在同一個工程中, 在C函式中呼叫C++函式或者在C++的函式中能夠呼叫C函式的方法。


C/C++混合程式設計有什麼用?

也許我們會有疑問,兩者主要的功能都不一樣,語法也不是完全相同,這不是沒事找事嗎?

實際在我們實際開發中,我們還是會用到的,比如C++語言支援函式過載,C語言不支援函式過載,那麼在C工程中加入C++就有用處了。

另外,如果一個完整的工程是用C語言實現的,但是再進行增改功能或者移植的時候,另一個工程師只會C++怎麼辦?那麼同樣,為了提高工作效率,還是各司其職,提供介面即可。


怎麼實現C/C++混合程式設計?

C++ 可以看作是 C 語言的擴充套件,它們呼叫的規則是相同的,但不同的程式語言都有自己的特性,混合使用時要處理全域性命名約定、命令、引數傳遞、資料型別轉換、出錯處理,以及兩種語言標準執行時的庫的混合等等一系列的問題。

我們需要了解一下extern "C",我們在閱讀程式時經常也會看到下面的程式碼


__cplusplus是在C++中特有的,__cplusplus其實就是C++,extern "C"是由C++提供的一個連線交換指定符號,目的是告訴C++這段程式碼是C函式。請記住:extern "C"後面的函式不使用的C++的名字修飾,而是用C語言來修飾。

在C++中呼叫C

C 程式和 C++ 程式唯一的區別主要體現在函式名上:C語言使用的是簡單的引數名,不考慮引數的個數和型別,而 C++ 中的函式總會將它的引數型別列表當作函式名的一部分。

因此 C++ 程式提供一些特殊的功能可以直接宣告呼叫 C 函式。

C函式例項如下:


C++函式例項如下:


在上述的程式碼中,C++ 程式中它的宣告是extern "C",那麼如何編譯檔案呢?可以使用下面的命令:

g++ -c main.cpp -o main.o

gcc -c helloworld.c -o helloworld.o

gcc main.o helloworld.o -lstdc++ -o main

使用的是 gcc 所以最後的連結過程中要指定 C++ 庫,如果使用 g++ 啟用連結,那麼就表示已經指定了 C++ 的庫。

extern "C"是指定編譯和連結的規約, 並不會影響語義。如果在標頭檔案中宣告函式,就要將整個標頭檔案都宣告為extern "C",這是標準 C++ 語法,展示如下:


在C中呼叫C++

在 C 程式中呼叫 C++ 程式時,C++ 程式提供的函式可以使用 C 語言的呼叫順序。

在C++ 程式中建立 C 函式例項如下:


C程式如下:


編譯使用的命令:

g++ -c hello.cpp -o hello.o

gcc -c main.c -o main.o

gcc hello.o main.o -lstdc++ -o main

在C++程式中函式sayhello()仍然是 C++ 的程式碼,我們可以在函式中隨意建立和清除物件。

如果在函式sayhello()內部呼叫 C 函式,還必須宣告呼叫的函式為extern "C",否則編譯程式會認定它為 C++ 函式,並且改變相應的函式名。


總結

C和C++對函式的處理方式是不同的,extern "C"是使C++能夠呼叫C的庫檔案的一個常用手段,在實際中還是經常用到的,如果要對編譯器使用C的方式來處理函式的話,那麼extern "C"就大有作為了。

————————————

- End -

不管你是轉行也好,初學也罷,進階也可,如果你想學程式設計,進階程式設計師~

【值得關注】我的編 程 學 習 交 流 俱 樂 部!【點選進入】

C語言入門資料(網盤連結免費分享):


C語言推薦書籍(PDF免費分享):