http://fangzhzh.info/blog/mixing-c-and-cpp-programming.html
在最近的arm開發中,因為一些特定的需求,需要使用從C檔案中調用以前C++程式中的類和方法。參考網上的一些資料,本文1將相關的知識點簡要總結如下:c&c++混合編程的注意事項,在c++函數中調用c函數的方法,在c函數中調用c++函數的方法,在c函數中調用C++對象及其中資料的方法。並在本文的末尾給出C和C++混合編程的例子,例子分別以Makefile和VC6.0工程的形式展現。 注意事項
本部分是從較高的角度需要注意的問題: C和C++編譯器必須要相容 C和C++編譯器要有相容的標頭檔和運行庫
建議使用同一個供貨商的編譯器:即如果使用的gnu,那麼C編譯器是gcc,C++編譯器是g++。 如何在C++代碼中包含標準C標頭檔。
包含一個標準的標頭檔(如<cstdio>),不需要任何特別的處理。
// c++ 代碼#include <cstdio> // 標頭檔包含沒啥特別處理int main(){ std::printf("Hello world\n");// 函數調用沒啥特別處理 return 0;}
如果,你認為std::printf中的std::很奇怪,那麼最好的方式就是“習慣它”。換句話說,這是使用標準庫函數的標準方法,所以習慣這種用法就好了。
但是,如果你想要使用C++編譯器來編譯C代碼的話,就不用使用這麼奇怪的std::printf()了。這種情況下,你需要包含<stdio.h>,而不是<cstdio>,神奇的命名空間會替你解決所有事情。代碼如下:
//使用C++編譯器編譯的C代碼#include <stdio.h> // 標頭檔包含沒啥特別處理int main(){ printf("Hello world\n");// 函數調用沒啥特別處理 return 0;}
補充:如果使用非標準庫的標頭檔的話,關注點會有所改變,非標準庫的使用有以下兩種情況:不能修改標頭檔和能夠修改標頭檔。 如何在C++代碼中包含非系統C標頭檔。
如果在C++系統中使用一個非系統提供的c標頭檔時,需要將#include代碼用extern “C”{}包含起來,這個聲明告訴C++編譯器,包含在內的是C函數的標頭檔。
//C++ 代碼extern "C" {//get declaration for f(int i, char c, float x) #include "my-c-code.h"}int main(){ f(7, 'x', 3.14); //正常調用}
補充:可能出現的不同情況系統提供的標準標頭檔(比如<cstdio>)和能夠修改標頭檔。 如何修改C標頭檔,以使之方便的被C++代碼#incldue。
如果需要包含一個非系統的C標頭檔,同時,你擁有修改此檔案的許可權,那麼強烈建議在檔案的內部加上extern “C” {…},以使用C++程式員能夠方便的使用。當然,作為C編譯器,是不理解什麼叫extern “C”的,因此,需要將extern “C”使用#ifdef包起來。 第一步:在C標頭檔的最頂端加上如下代碼(__cplusplus只存在於C++編譯器下)
#ifdef __cplusplusextern "C" {#endif
第二步:在C標頭檔的最尾部加入如下代碼
#ifdef __cplusplus}#endif
現在,就可以在C++代碼中使用C標頭檔,而不用使用任何蹩腳的extern “C” {}
// this is c++ code//get the declaration of f(int i, char c, float x)#include "my-c-mode.h"int main(){ f(7, 'x', 3.14); //正常調用}
補充:可能出現的不同情況系統提供的標準標頭檔(比如<cstdio>)和不能修改標頭檔。