简述
我们在编写C程序或C++程序时,C调C 或 C++调C++都是非常简单的,但是C如何调C++中的方法呢?C++又如何调用C中的方法呢?
因为编译器在编译C++和C的方法时方式是不同的,所以肯定不能直接按照C或C++中的方式来调用。正确的调用方式是需要结合“__cplusplus”和“extern "C””来使用,下面结合实例来介绍。
详解
1、C文件调用C++文件中方法
首先在C++文件(.cpp)中编写C需要调用的方法:
/************************************************************************/
/* C 调 C++ 的函数 */
/************************************************************************/
extern "C"
{
void showInfo(char* data)
{
CString m_show = " ";
m_show += data;
g_VoiceText->m_showList.SetSel(sel_begin, -1);
g_VoiceText->m_showList.GetSel(sel_begin, sel_curr);
g_VoiceText->m_showList.ReplaceSel(m_show);
return;
}
void nextLine()
{
CString m_show= "";
m_show += "\r\n";
m_show += "\r\n";
g_VoiceText->m_showList.GetSel(sel_begin, sel_curr);
g_VoiceText->m_showList.SetSel(sel_curr, -1);
g_VoiceText->m_showList.ReplaceSel(m_show);
g_VoiceText->m_showList.GetSel(sel_begin, sel_curr);
sel_begin = sel_curr;
return;
}
}
然后在C文件中声明需要调用的C++中的方法:
调用时直接使用即可:
这样就完成了C文件调用C++文件中方法的所有操作了。
extern "C"表示编译生成的内部符号名使用C约定。
2、C++文件调用C文件中方法
首先在C文件中编写C++需要调用的方法:
/************************************************************************/
/* C++ 调 C 的函数 */
/************************************************************************/
//在MFC中使用控制台输出
void InitConsole()
{
int nRet= 0;
FILE* fp;
AllocConsole();
nRet= _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
fp = _fdopen(nRet, "w");
*stdout = *fp;
setvbuf(stdout, NULL, _IONBF, 0);
}
void QuitAll()
{
end_status = 1;
}
然后在C++文件(.cpp)中声明C文件中的方法,注意,不是普通的声明,而是结合“__cplusplus”和“extern "C””来声明,告诉编译器,这是C方法,需要使用C方式来编译它们。
调用时,直接使用即可:
这样就完成了C++文件调用C文件中方法的所有操作了。
这里为什么要用:
#ifdef _cplusplus
extern "C"{
#endif
//函数
#ifdef _cplusplus
}
来声明方法呢?因为这样我们在C和C++都可以调用。如果只是以下面这种方式来声明:
extern "C"{
//函数
}
那么就只能在C文件中使用了。