簡體   English   中英

使用extern“C”在C文件中調用C ++類函數

[英]Calling C++ class functions in C file using extern “C”

我試圖使用extern "C"來能夠在不同的C文件中調用C ++類。 我可以構建這個很好,直到我實際上將.h包含在我要調用C ++類的C文件中。

MyClass.cpp

MyClass::MyClass(){};
MyClass::~MyClass(){};

extern "C" void* MyClassInit(){
    return new MyClass();
}

MyClass.h

extern "C" void* MyClassInit();

好的 - 以上編譯。 但現在我想在另一個.c文件中使用MyClassInit 只要我

#include "MyClass.h"我得到的那個文件中的#include "MyClass.h"

error: expected identifier or '(' before string constantMyClass.h中的error: expected identifier or '(' before string constant ,其中定義了externs。

我假設我錯過了一些“if cplusplus”或其他extern或其他非常模糊的東西。

extern "C"沒有extern "C" :C編譯器不會理解它並且會阻塞它。 您需要僅將此指令公開給C ++編譯器。 這就是為什么經常在這樣的標題中你找到這個(一個隨機的例子,例如這里 ):

#ifdef __cplusplus
extern "C" {
#endif

... code ...

#ifdef __cplusplus
}
#endif

C預處理器將刪除extern "C" ,僅保留附帶的代碼,而對於C ++編譯器,相同的文件將看起來像

extern "C" {
... code ...
}

更新:關於整個extern "C"構造的目的的幾句話,以及為什么它只出現在C ++中,正如Justin Randall在評論中所建議的那樣。 也許需要它的主要原因是它可以防止名稱損壞 當存在相同名稱的重載函數時,這很重要:錯位名稱是唯一的,因此可以區分這些名稱。 另一方面,C中沒有重載,因此沒有名稱重寫,也不需要extern塊。

簡而言之,典型的C ++編譯器傾向於將像void f()這樣的函數重命名為_Z1fv類的_Z1fv 但是C編譯器會查找f並失敗。 extern "C"使前者使用后者所期望的相同符號名稱。

可以在此處找到更精確的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM