[英]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 constant
在MyClass.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.