Python實戰社羣php
Java實戰社羣ios
長按識別下方二維碼,按需求添加c++
掃碼關注添加客服程序員
進Python社羣▲web
掃碼關注添加客服算法
進Java社羣▲編程
做者丨李肖遙
c#
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"
就大有做爲了。
程序員專欄 掃碼關注填加客服 長按識別下方二維碼進羣
近期精彩內容推薦:
在看點這裏好文分享給更多人↓↓