C/C++還能混合編程?這讓我事半功倍

Python實戰社羣

Java實戰社羣

長按識別下方二維碼,按需求添加

掃碼關注添加客服

進Python社羣▲

掃碼關注添加客服

進Java社羣

作者丨李肖遙

ID丨技術讓夢想更偉大

什麼是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",我們在閱讀程序時經常也會看到下面的代碼

1#ifdef __cplusplus
2extern "C" {
3#endif
4
5void fun(void* ,int);
6
7#ifdef __cplusplus
8}
9#endif

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

在C++中調用C

C 程序和 C++ 程序唯一的區別主要體現在函數名上:C語言使用的是簡單的參數名,不考慮參數的個數和類型,而 C++ 中的函數總會將它的參數類型列表當作函數名的一部分。因此 C++ 程序提供一些特殊的功能可以直接聲明調用 C 函數。

C函數實例如下:

1/*helloworld.c*/
2#include <stdio.h>
3void sayhello(char *str)
4{
5       printf(“hello world\n”);
6}

C++函數實例如下:

1/*main.cpp*/
2#include <iostream>
3using namespace std;
4extern “C” void sayhello(char *str);
5int main(int argc,char *argv[])
6{
7       sayhello(“hello from cpp to c\n”);
8       return 0;
9}

在上述的代碼中,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++ 語法,展示如下:

1extern “C”{
2       int add(int a,int b);
3       double div(double a,double b);
4};

在C中調用C++

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

在C++ 程序中創建 C 函數實例如下:

1/*helloworld.cpp*/
2#include <iostream>
3using namespace std;
4extern “C” void sayhello(char *str);
5void sayhello(char *str)
6{
7     cout<<str<<endl;
8}

C程序如下:

1/*main.c*/
2#include <stdio.h>
3int main(int argc,char *argv[])
4{
5    Sayhello(“hello form C to C++”);
6    return 0;
7}

編譯使用的命令:

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"就大有作爲了。

程序員專欄 掃碼關注填加客服 長按識別下方二維碼進羣

近期精彩內容推薦:  

 爲何說IT科技公司應該留住35歲員工?

 工友們!大家好,今天你摸魚了嗎?

 緩存穿透,雪崩,擊穿以及解決方案分析

 圖文詳解:如何給女朋友解釋什麼是微服務?


在看點這裏好文分享給更多人↓↓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章