C++是在C的基礎(chǔ)上發(fā)展起來的。當(dāng)我們用C++寫項(xiàng)目工程的時(shí)候,很有可能以前的許許多多的代碼都是用C語言寫的。那么,當(dāng)我們用C++編譯程序的時(shí)候,之前用C寫的代碼就放棄不用了嗎?當(dāng)然不可能。如果工程量浩大,直接放棄之前用C寫的程序重新用C++寫一遍耗時(shí)又耗力,更何況C++自誕生以來就有一個(gè)重大的使命——兼容C語言。更何況之前用C寫的代碼是經(jīng)過檢驗(yàn)的可以使用的代碼,難道就能因?yàn)楝F(xiàn)在用C++來寫工程,之前寫的完全可以運(yùn)行的大量C代碼就不用了嗎?很顯然,不肯能吧。
那么,有人就會(huì)感到疑惑了。C++ 既然天生就是能夠兼容C語言的,那么用C++編譯器編譯C語言完全是可以通過的啊。難道不對(duì)嗎?對(duì)的,完全正確。如果是源碼,那么C++編譯器完全可以通過運(yùn)行。但是,如果一段程序是用C寫的,這段代碼已經(jīng)被編譯成了目標(biāo)文件,那么還能再用C++編譯通過嗎?顯然,已經(jīng)不行了。關(guān)于這點(diǎn)的實(shí)際使用就是,我們?cè)贑++程序里面會(huì)用到一些第三方的庫,而這些庫是用C語言編寫并編譯的。
所以,我們?cè)趯?shí)際工程中,必須得讓C++代碼能夠使用C語言編寫的庫。
接下來,我們用一個(gè)簡(jiǎn)單的例子來說明,我們上面闡述的內(nèi)容。
首先,我們先來寫一個(gè)簡(jiǎn)單的函數(shù),該函數(shù)在add.c這個(gè)文件中實(shí)現(xiàn)。這個(gè)函數(shù)實(shí)現(xiàn)相加功能(喂喂喂,怎么寫這么簡(jiǎn)單的一個(gè)函數(shù)啊?說明原理用不著舉一個(gè)很深?yuàn)W的例子吧,啊哈哈哈)
神池ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
int add ( int a, int b ){
return a + b;
}
接下來,我們?cè)賹懸粋€(gè)頭文件,用來聲明我們所寫的函數(shù)。
int add ( int a, int b );
然后,我們可以經(jīng)過編譯生成一個(gè)目標(biāo)文件。
這個(gè)add.o文件就是我們編譯后生成的。
然后,我們要開始編寫主程序。
int main ( int argc, char** argv ){
printf ( "sum = %d\n", add ( 2, 3 ) );
system ( "pause" );
return 0;
}
這段主程序被保存在main.cpp這個(gè)文件中。接下來,我們來編譯運(yùn)行程序。
編譯后,我們發(fā)現(xiàn),程序報(bào)錯(cuò)了。錯(cuò)誤信息提示說,我們沒有聲明這個(gè)函數(shù),可是我們明明聲明了呀,這是為什么呢?我們可以先來查看一下,add.o文件中到底有沒有add函數(shù)。
經(jīng)過查看后,我們發(fā)現(xiàn),add.o中確實(shí)是有add函數(shù)的啊。
那么,很明顯,由于我們上面的操作,這個(gè)add.o文件是用C語言編譯器編譯出來的。而這個(gè)main.cpp是用C++編譯器編譯。所以,我們直接想用C++編譯器使用C編寫的目標(biāo)代碼就會(huì)報(bào)錯(cuò)。
假如我們?cè)趯?shí)際工程中,有大量的第三方庫都是用C編寫的,而我們用的確實(shí)c++語言,編譯器也是用的C++編譯器,那這個(gè)用C語言寫的第三方庫我們就不用了嗎?當(dāng)然不是,肯定會(huì)有解決方案。怎么解決呢?
extern關(guān)鍵字能強(qiáng)制讓C++編譯器進(jìn)行C方式的編譯。
那么,我們?cè)贑++文件中,加上這么段代碼,就可以告訴編譯器,其中的C代碼要用C方式編譯。
extern "C"
{
#include "add.h"
}
這樣以來,我們就告訴編譯器,我們用extern包含的頭文件中的代碼是C代碼,我們要用C編譯器來編譯它。
下面上main.cpp中的完整代碼:
#include <stdio.h>
#include <stdlib.h>
extern "C"
{
#include "add.h"
}
int main ( int argc, char** argv ){
printf ( "sum = %d\n", add ( 2, 3 ) );
system ( "pause" );
return 0;
}
然后,我們?cè)賮砭幾g一下。
運(yùn)行之后,我們發(fā)現(xiàn),編譯通過,并且運(yùn)行結(jié)果正確。
由上面這個(gè)例子,我們又引出一個(gè)問題:我們?nèi)绾伪WC一段代碼始終以C的方式被編譯。可能有部分大佬覺得,剛剛不是才學(xué)過嗎,用extern。那么不好意思大佬,我得告訴你,extern在C++中才支持,在C中就不支持了。
不信的話,大佬們,我們一起來實(shí)驗(yàn)一下。首先,我們來定義一個(gè)main.c文件。
#include <stdio.h>
#include <stdlib.h>
extern "C"
{
#include "add.h"
}
int main ( int argc, char** argv ){
printf ( "sum = %d\n", add ( 2, 3 ) );
system ( "pause" );
return 0;
}
運(yùn)行之后,我們發(fā)現(xiàn),
程序報(bào)錯(cuò)了。
上面這段不符合C的規(guī)則,因?yàn)閑xtern可是C++的寫法。(大佬們這下應(yīng)該相信小生說的話了吧)
那么,我們?cè)趺醋霾拍鼙WC這段代碼既能被C++編譯過又能被C編譯過?解決方案當(dāng)然是有的啦。如果沒有,我就不在這里吹牛B了,啊哈哈哈。怎么做呢?
通過使用C++編譯器內(nèi)置的一個(gè)標(biāo)準(zhǔn)宏_cplusplus。通過這個(gè)標(biāo)準(zhǔn)宏我們可以判斷該編譯器是否是C++編譯器。
接下來,我們來實(shí)際使用一下:
#ifdef _cplusplus
extern "c" {
#endif
#include "add.h"
#ifdef _cplusplus
}
#endif
我們只要將這段代碼加到main.c文件中去就可以了。我們來編譯一下:
編譯之后,我們發(fā)現(xiàn),編譯通過了。問題被完美的解決了。
網(wǎng)站欄目:工程實(shí)戰(zhàn)中的使用技巧——C++和C的相互調(diào)用
文章路徑:http://jinyejixie.com/article46/pocheg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站改版、品牌網(wǎng)站設(shè)計(jì)、虛擬主機(jī)、外貿(mào)網(wǎng)站建設(shè)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
移動(dòng)網(wǎng)站建設(shè)知識(shí)