C++是在C的基礎上發(fā)展起來的。當我們用C++寫項目工程的時候,很有可能以前的許許多多的代碼都是用C語言寫的。那么,當我們用C++編譯程序的時候,之前用C寫的代碼就放棄不用了嗎?當然不可能。如果工程量浩大,直接放棄之前用C寫的程序重新用C++寫一遍耗時又耗力,更何況C++自誕生以來就有一個重大的使命——兼容C語言。更何況之前用C寫的代碼是經(jīng)過檢驗的可以使用的代碼,難道就能因為現(xiàn)在用C++來寫工程,之前寫的完全可以運行的大量C代碼就不用了嗎?很顯然,不肯能吧。
那么,有人就會感到疑惑了。C++ 既然天生就是能夠兼容C語言的,那么用C++編譯器編譯C語言完全是可以通過的啊。難道不對嗎?對的,完全正確。如果是源碼,那么C++編譯器完全可以通過運行。但是,如果一段程序是用C寫的,這段代碼已經(jīng)被編譯成了目標文件,那么還能再用C++編譯通過嗎?顯然,已經(jīng)不行了。關于這點的實際使用就是,我們在C++程序里面會用到一些第三方的庫,而這些庫是用C語言編寫并編譯的。
所以,我們在實際工程中,必須得讓C++代碼能夠使用C語言編寫的庫。
接下來,我們用一個簡單的例子來說明,我們上面闡述的內(nèi)容。
首先,我們先來寫一個簡單的函數(shù),該函數(shù)在add.c這個文件中實現(xiàn)。這個函數(shù)實現(xiàn)相加功能(喂喂喂,怎么寫這么簡單的一個函數(shù)???說明原理用不著舉一個很深奧的例子吧,啊哈哈哈)
神池ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
int add ( int a, int b ){
return a + b;
}
接下來,我們再寫一個頭文件,用來聲明我們所寫的函數(shù)。
int add ( int a, int b );
然后,我們可以經(jīng)過編譯生成一個目標文件。
這個add.o文件就是我們編譯后生成的。
然后,我們要開始編寫主程序。
int main ( int argc, char** argv ){
printf ( "sum = %d\n", add ( 2, 3 ) );
system ( "pause" );
return 0;
}
這段主程序被保存在main.cpp這個文件中。接下來,我們來編譯運行程序。
編譯后,我們發(fā)現(xiàn),程序報錯了。錯誤信息提示說,我們沒有聲明這個函數(shù),可是我們明明聲明了呀,這是為什么呢?我們可以先來查看一下,add.o文件中到底有沒有add函數(shù)。
經(jīng)過查看后,我們發(fā)現(xiàn),add.o中確實是有add函數(shù)的啊。
那么,很明顯,由于我們上面的操作,這個add.o文件是用C語言編譯器編譯出來的。而這個main.cpp是用C++編譯器編譯。所以,我們直接想用C++編譯器使用C編寫的目標代碼就會報錯。
假如我們在實際工程中,有大量的第三方庫都是用C編寫的,而我們用的確實c++語言,編譯器也是用的C++編譯器,那這個用C語言寫的第三方庫我們就不用了嗎?當然不是,肯定會有解決方案。怎么解決呢?
extern關鍵字能強制讓C++編譯器進行C方式的編譯。
那么,我們在C++文件中,加上這么段代碼,就可以告訴編譯器,其中的C代碼要用C方式編譯。
extern "C"
{
#include "add.h"
}
這樣以來,我們就告訴編譯器,我們用extern包含的頭文件中的代碼是C代碼,我們要用C編譯器來編譯它。
下面上main.cpp中的完整代碼:
#include
#include
extern "C"
{
#include "add.h"
}
int main ( int argc, char** argv ){
printf ( "sum = %d\n", add ( 2, 3 ) );
system ( "pause" );
return 0;
}
然后,我們再來編譯一下。
運行之后,我們發(fā)現(xiàn),編譯通過,并且運行結(jié)果正確。
由上面這個例子,我們又引出一個問題:我們?nèi)绾伪WC一段代碼始終以C的方式被編譯??赡苡胁糠执罄杏X得,剛剛不是才學過嗎,用extern。那么不好意思大佬,我得告訴你,extern在C++中才支持,在C中就不支持了。
不信的話,大佬們,我們一起來實驗一下。首先,我們來定義一個main.c文件。
#include
#include
extern "C"
{
#include "add.h"
}
int main ( int argc, char** argv ){
printf ( "sum = %d\n", add ( 2, 3 ) );
system ( "pause" );
return 0;
}
運行之后,我們發(fā)現(xiàn),
程序報錯了。
上面這段不符合C的規(guī)則,因為extern可是C++的寫法。(大佬們這下應該相信小生說的話了吧)
那么,我們怎么做才能保證這段代碼既能被C++編譯過又能被C編譯過?解決方案當然是有的啦。如果沒有,我就不在這里吹牛B了,啊哈哈哈。怎么做呢?
通過使用C++編譯器內(nèi)置的一個標準宏_cplusplus。通過這個標準宏我們可以判斷該編譯器是否是C++編譯器。
接下來,我們來實際使用一下:
#ifdef _cplusplus
extern "c" {
#endif
#include "add.h"
#ifdef _cplusplus
}
#endif
我們只要將這段代碼加到main.c文件中去就可以了。我們來編譯一下:
編譯之后,我們發(fā)現(xiàn),編譯通過了。問題被完美的解決了。