2012-07-10 43 views
0

假設我有一個使用類和模板的C++庫lib.h。再假設我有以下的自定義C++頭myLink.h:c和C++與庫的鏈接

#include "lib.h" 

    //call methods from lib.h that use templates and classes 
    // and return an integer based off of the information gained from calling functions lib.h 
    extern "C" int foo(int param1, const int param2); 

現在假設我在一個名爲C test.c.如下調用函數foo()是否合法?

//in test.c 
int first = foo(5, 6); 

此外,編譯的目標代碼/鏈接器階段發生了什麼?

謝謝!

+2

您可能希望讓您的「myLink.h」能夠從C和C++編譯,例如通過使用'#ifdef __cplusplus'在單獨的行上包裝'extern「C」{'和'}'。這樣'int foo(int param1,const int param2);'部分對於純C代碼是可見的,其餘部分對C++是可見的。如果沒有這個,你的「test.c」將需要一個單獨的方法來聲明函數。 – 2012-07-10 03:19:29

回答

0

按如下方式調用函數foo()是否合法?

int first = foo(5, 6); 

是的,這是合法的。儘管您應該閱讀以下內容,以確保此法律通話將鏈接。

彙編的對象代碼/鏈接器階段發生了什麼?

類的使用不會干涉。 C++類將被編譯爲鏈接器將理解的對象代碼。從多德的評論

編輯:

你的模板也將憑藉foo稱他們創建的。

+0

不是真的 - 如果'foo'使用任何模板,當您編譯定義'foo'的C++源文件時,它們將被實例化。 – 2012-07-10 03:19:49

+0

@ChrisDodd:你是對的!謝謝。 – 2012-07-10 03:27:31

+0

您可能需要鏈接一個支持C++的鏈接器。 C++端可能具有訪問靜態對象,使用異常處理或任何需要特定於C++的初始化代碼的其他任何東西的代碼。 – sfstewman 2012-07-10 04:01:04