C/C++还能混合编程
什么是C/C++混合編程?
我們都知道C是一個(gè)結(jié)構(gòu)化語言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過一個(gè)過程,對輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)
對于C++,首要考慮的是如何構(gòu)造一個(gè)對象模型,讓這個(gè)模型能夠契合與之對應(yīng)的問題域,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制
那么什么是C/C++混合編程?實(shí)際上簡單點(diǎn)說C/C++混合編程就是在同一個(gè)工程中,在C函數(shù)中調(diào)用C++函數(shù)或者在C++的函數(shù)中能夠調(diào)用C函數(shù)的方法。
C/C++混合編程有什么用?
也許我們會有疑問,兩者主要的功能都不一樣,語法也不是完全相同,這不是沒事找事嗎?
實(shí)際在我們實(shí)際開發(fā)中,我們還是會用到的,比如C++語言支持函數(shù)重載,C語言不支持函數(shù)重載,那么在C工程中加入C++就有用處了。
另外,如果一個(gè)完整的工程是用C語言實(shí)現(xiàn)的,但是再進(jìn)行增改功能或者移植的時(shí)候,另一個(gè)工程師只會C++怎么辦?那么同樣,為了提高工作效率,還是各司其職,提供接口即可。
怎么實(shí)現(xiàn)C/C++混合編程?
C++ 可以看作是C語言的擴(kuò)展,它們調(diào)用的規(guī)則是相同的,但不同的編程語言都有自己的特性,混合使用時(shí)要處理全局命名約定、命令、參數(shù)傳遞、數(shù)據(jù)類型轉(zhuǎn)換、出錯(cuò)處理,以及兩種語言標(biāo)準(zhǔn)運(yùn)行時(shí)的庫的混合等等一系列的問題。
我們需要了解一下extern "C",我們在閱讀程序時(shí)經(jīng)常也會看到下面的代碼
#ifdef __cplusplus extern "C" { #endifvoid fun(void *, int);#ifdef __cplusplus } #endif__cplusplus是在C++中特有的,__cplusplus其實(shí)就是C++,extern "C"是由C++提供的一個(gè)連接交換指定符號,目的是告訴C++這段代碼是C函數(shù)。請記住:extern "C"后面的函數(shù)不適用的C++的名字修飾,而是用C語言來修飾。
在C++中調(diào)用C
C 程序和 C++ 程序唯一的區(qū)別主要體現(xiàn)在函數(shù)名上: C語言使用的是簡單的參數(shù)名,不考慮參數(shù)的個(gè)數(shù)和類型,而C++中的函數(shù)總會將它的參數(shù)類型列表當(dāng)作函數(shù)名的一部分。因此C++程序提供一些特殊的功能可以直接表明調(diào)用C函數(shù)。
C函數(shù)實(shí)例如下:
/*helloworld.c*/ #include <stdio.h> void sayhello(char *str) {printf("hello world\n"); }C++函數(shù)實(shí)例如下:
/*main.cpp*/ #include <iostream> using namespace std; extern "C" void sayhello(char *str); int main(int argc, char *argv[]) {sayhello("hello from cpp to c\n");return 0; }在上述的代碼中,C++程序中它的聲明是extern "C", 那么如何編譯文件呢?可以使用下面的命令:
g++ -c main.cpp -o main.o gcc -c helloworld.c helloworld.o gcc main.o helloworld.o -lstdc++ -o main使用的是gcc所以最后的鏈接過程中要指定C++庫,如果使用g++激活鏈接,那么就表示已經(jīng)指定了C++的庫。
extern "C"是指定編譯和鏈接的規(guī)約,并不會影響語義。如果在頭文件中聲明函數(shù),就要將整個(gè)頭文件都聲明為extern "C", 這是標(biāo)準(zhǔn)C++語法,展示如下:
extern "C" {int add(int a, int b);double div(double a, double b); };在C中調(diào)用C++
在 C 程序中調(diào)用C++程序時(shí),C++程序提供的函數(shù)可以使用C語言的調(diào)用順序。
在C++程序中創(chuàng)建C函數(shù)實(shí)例如下:
/*helloworld.cpp*/ #include <iostream> using namespace std; extern "C" void sayhello(char *str); void sayhello(char *str) {cout << str << endl; }C程序如下:
/*main.c*/ #include <stdio.h> int main(int argc, char *argv[]) {sayhello("hello form C to C++");return 0; }編譯使用的命令:
g++ -c hello.cpp -o hello.o gcc -c main.c -o main.o gcc hello.o main.o -lstdc++ -o main在C++程序中函數(shù)sayhello()仍然是C++的代碼,我們可以在函數(shù)中隨意創(chuàng)建和清除對象。如果在函數(shù)sayhello()內(nèi)部調(diào)用C函數(shù),還必須表明調(diào)用的函數(shù)為extern "C",否則編譯程序會認(rèn)定它為C++函數(shù),并且改變相應(yīng)的函數(shù)名。
總結(jié)
C和C++對函數(shù)的處理方式是不同的,extern "C" 是使C++能夠調(diào)用C的庫文件的一個(gè)常用手段,在實(shí)際中還是經(jīng)常用到的,如果要對編譯器使用C的方式來處理函數(shù)的話,那么extern "C"就大有作為了。
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的C/C++还能混合编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用localStorage本地储存js
- 下一篇: c++ 数组引用_在 Solidity中