2016-04-18 57 views
1

假設我們有一個C++項目。我們可以使用通過extern "C"關鍵字在C++項目中的C文件中定義的函數。例如:我們可以在C文件中定義一個C++方法嗎?

C代碼:cfile.c

#include <stdio.h> 

void f(void) 
{ 
    printf("\n This is a C code\n"); 
} 

.cpp的代碼:cppfile.cpp

#include <iostream> 

extern "C" { 
void f(); 
} 

int main(void) 
{ 
    f(); 
    return 0; 
} 

因此,我們可以做到這一點了相反的情況:

Cpp代碼:cppCode.cpp

struct MyClass 
{ 
    virtual void f(const char* text); 
    void func(const char* text); 
}; 

我們可以實現在C文件中f方法和func方法(例如:cCode.c???這可能嗎? (只是我個人的目的問題

+2

編號類成員函數總是具有C++語言鏈接,所以它們永遠不能匹配C翻譯單元導出的任何函數。 –

+0

@KerrekSB你不能在選項中編輯它嗎? –

+1

@GillBates,不,這是不可能的,因爲調用約定是不同的。 C編譯器無法生成對類方法的正確調用。 – SergeyA

回答

4

你不能直接這樣做。但是,有一個解決方法(各種)。你可以有一個帶「C」鏈接的函數,它返回指向類的對象的指針 - 可能是動態分配的 - 轉換爲void*

比你可以實現映射到類內函數的函數,但會增加一個參數 - void*,這將是從上面調用創建函數獲得的地址。他們會簡單地將這個void*轉換爲類的類型並將其稱爲成員。

最後,你需要一個可以正確刪除指針的dispose函數。

+0

,你能否給我一個詳細的例子SergeyA。謝謝 –

相關問題