工程實戰中的使用技巧——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++代碼可以使用C語言編寫的庫。
接下來,咱們用一個簡單的例子來講明,咱們上面闡述的內容。
首先,咱們先來寫一個簡單的函數,該函數在add.c這個文件中實現。這個函數實現相加功能(喂喂喂,怎麼寫這麼簡單的一個函數啊?說明原理用不着舉一個很深奧的例子吧,啊哈哈哈)c++

int add ( int a, int b ){

    return a + b;
}

接下來,咱們再寫一個頭文件,用來聲明咱們所寫的函數。ide

int add ( int a, int b );

而後,咱們能夠通過編譯生成一個目標文件。
工程實戰中的使用技巧——C++和C的相互調用
這個add.o文件就是咱們編譯後生成的。
工程實戰中的使用技巧——C++和C的相互調用
而後,咱們要開始編寫主程序。函數

int main ( int argc, char** argv ){

    printf ( "sum = %d\n", add ( 2, 3 ) );

    system ( "pause" );
    return 0;
}

這段主程序被保存在main.cpp這個文件中。接下來,咱們來編譯運行程序。
工程實戰中的使用技巧——C++和C的相互調用
編譯後,咱們發現,程序報錯了。錯誤信息提示說,咱們沒有聲明這個函數,但是咱們明明聲明瞭呀,這是爲何呢?咱們能夠先來查看一下,add.o文件中到底有沒有add函數。
工程實戰中的使用技巧——C++和C的相互調用
通過查看後,咱們發現,add.o中確實是有add函數的啊。
那麼,很明顯,因爲咱們上面的操做,這個add.o文件是用C語言編譯器編譯出來的。而這個main.cpp是用C++編譯器編譯。因此,咱們直接想用C++編譯器使用C編寫的目標代碼就會報錯。
假如咱們在實際工程中,有大量的第三方庫都是用C編寫的,而咱們用的確實c++語言,編譯器也是用的C++編譯器,那這個用C語言寫的第三方庫咱們就不用了嗎?固然不是,確定會有解決方案。怎麼解決呢?
extern關鍵字能強制讓C++編譯器進行C方式的編譯。
那麼,咱們在C++文件中,加上這麼段代碼,就能夠告訴編譯器,其中的C代碼要用C方式編譯。3d

extern "C"
{
    #include "add.h"
}

這樣以來,咱們就告訴編譯器,咱們用extern包含的頭文件中的代碼是C代碼,咱們要用C編譯器來編譯它。
下面上main.cpp中的完整代碼:code

#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++和C的相互調用
運行以後,咱們發現,編譯經過,而且運行結果正確。
由上面這個例子,咱們又引出一個問題:咱們如何保證一段代碼始終以C的方式被編譯。可能有部分大佬以爲,剛剛不是才學過嗎,用extern。那麼很差意思大佬,我得告訴你,extern在C++中才支持,在C中就不支持了。
不信的話,大佬們,咱們一塊兒來實驗一下。首先,咱們來定義一個main.c文件。blog

#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++和C的相互調用
程序報錯了。
上面這段不符合C的規則,由於extern但是C++的寫法。(大佬們這下應該相信小生說的話了吧)
那麼,咱們怎麼作才能保證這段代碼既能被C++編譯過又能被C編譯過?解決方案固然是有的啦。若是沒有,我就不在這裏吹牛B了,啊哈哈哈。怎麼作呢?
經過使用C++編譯器內置的一個標準宏_cplusplus。經過這個標準宏咱們能夠判斷該編譯器是不是C++編譯器。
接下來,咱們來實際使用一下:編譯器

#ifdef _cplusplus
extern "c" {
#endif
#include "add.h"
#ifdef _cplusplus
}
#endif

咱們只要將這段代碼加到main.c文件中去就能夠了。咱們來編譯一下:
工程實戰中的使用技巧——C++和C的相互調用
編譯以後,咱們發現,編譯經過了。問題被完美的解決了。源碼

相關文章
相關標籤/搜索