2009-02-08 21 views
5

我正在用C語言編寫一個(我的第一個)C++類,但是我只能通過在extern塊中聲明C函數來編譯C++。我的項目使用autotools;有什麼辦法可以自動化這個過程,所以我不必維護兩個頭文件?從C++使用自動工具使用C代碼

回答

3

是創建包裝的頭文件,其中包括像這樣的C頭文件...

//Wrapper.h 
#ifdef __cplusplus 
extern "C" 
{ 

    #include "Actual.h" 
} 
#else 
    #include "Actual.h" 
#endif 


//Use.cpp 
#include "Wrapper.h" 

int main() 
{ 
    return 0; 
} 

//Use.c 
#include "Wrapper.h" 
/*or #include "Actual.h" */ 

int main() 
{ 
    return 0; 
} 
+0

謝謝!非常感激。 – drkatz 2009-02-08 21:50:08

+0

雖然這當然有效,但我認爲下面更高評價的答案更好 - 在實際頭文件中使用預處理器來聲明函數extern C。這樣,你可以在C和C++中以相同的方式包含頭文件,而不必擔心額外的「包裝器」頭文件。 – 2009-02-09 18:14:31

15

用C代碼使用的extern塊的#ifdef中頭文件

的頭文件

開始

#ifdef __cplusplus 
extern "C" { 
#endif 

...並在頭文件的末尾

#ifdef __cplusplus 
} 
#endif 

這樣,它將適用於包含在C和C++源中

1

使用C預處理器。做這樣的事情:

#ifdef __cplusplus 
extern "C" { 
#endif 
// code goes here 

#ifdef __cplusplus 
} 
#endif 
1

我們在頭文件中的宏:

#ifdef __cplusplus 
    #define _crtn "C" 
#else 
    #define _crtn 
#endif 
在頭文件

然後,我們可以使用_crtn

#include "croutine.h" 

extern _crtn void MyFunction(...); 

唯一的疑難雜症是確保在包含MyFunction實現的文件中包含包含MyFunction原型的頭文件,以便使用「C」鏈接進行編譯。

這和@ epatel的答案是一樣的,只是在一個頭文件中只需要醜陋的#ifdef