C++ 调用C++;使用extern“在C文件中初始化函数;";

C++ 调用C++;使用extern“在C文件中初始化函数;";,c++,c,C++,C,我试图使用外“C”来调用一个不同的C文件中的C++类。我可以构建这个细部,直到我实际上包含了 .h /COD>在C文件中,我想从C++调用C++类。p> MyClass.cpp MyClass::MyClass(){}; MyClass::~MyClass(){}; extern "C" void* MyClassInit(){ return new MyClass(); } MyClass.h extern "C" void* MyClassInit(); 好的,上面的编译。但是

我试图使用<代码>外“C”<代码>来调用一个不同的C文件中的C++类。我可以构建这个细部,直到我实际上包含了<代码> .h /COD>在C文件中,我想从C++调用C++类。p> MyClass.cpp

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

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

extern "C" void* MyClassInit();
好的,上面的编译。但是现在我想在另一个
.c
文件中使用
MyClassInit
。我一

#在我得到的文件中包含“MyClass.h”

错误:在定义外部变量的
MyClass.h
中,字符串常量之前应有标识符或“(”字符

我假设我缺少了一些“如果cPLUS PLUS”或其他外部或其他非常模糊的东西。

< P> C++中没有<代码>外“C”<代码>:C编译器不会理解这一点,并且会阻塞它。你只需要将这个指令暴露给C++编译器。这就是为什么在这样的头中经常发现这个(例如一个随机的例子):

C预处理器将删除<代码>外部“C”<代码>,只保留所附代码,而对于C++编译器,同一文件将看起来像

extern "C" {
... code ...
}
更新:关于整个
外部“C”的几句话构造,以及为什么它只出现在C++中,如Justin Randall在注释中所建议的。也许这是需要的首要原因,它是防止的。当重命名函数存在时,这是很重要的:被损坏的名称是唯一的,因此可以区分。另一方面,C中没有过载,所以也没有名称损坏,也不需要
extern

长篇短,一个典型的C++编译器将倾向于重命名一个函数,如代码>,例如,例如“代码>”,“Z1FV < /代码>。但是C编译器会寻找<代码> f>代码>失败。<代码>外“C”<代码>使前者使用与后者相同的符号名称。


可以找到更精确的信息。

缺失;在header???IINM中,您需要从C端删除
外部“C”
。最简单的方法是使其成为一个由
\ifdef\uu cplusplus
切换的宏。哦,哇……我终于理解了这段乱七八糟的代码:)谢谢。问一下,
extern“C”
是否需要出现在.cpp文件中?一个好问题的简洁回答很好。值得一提的是,<代码>外部“C”{} /COD>只是告诉C++编译器不这样做,这就是为什么C编译器会阻塞它的原因。
extern "C" {
... code ...
}