最新在做Ubuntu上面的C++开发,其中用到了部分C库,那么就涉及到C和C++之间的混合调用,C++调用C语言比较方便,反之则要稍作变通。
1. C++ 调用 C 语言
头文件包含:
1 2 3 4 5 6 7 8 | extern "C" { #include "iec61850_server.h" #include "iso_server.h" #include "acse.h" #include "thread.h" #include "model.h" } |
extern "C"
{
#include "iec61850_server.h"
#include "iso_server.h"
#include "acse.h"
#include "thread.h"
#include "model.h"
}函数调用:
IedServer_observeDataAttribute(iedServer, (DataAttribute*)mmsi.dmm, observerCallback);
回调函数observerCallback的声明和实现如下:
1 2 3 4 5 6 7 | extern "C" { void observerCallback(DataAttribute* dataAttribute) { call_Lib_daObserverCallback(mod, dataAttribute); } } |
extern "C"
{
void observerCallback(DataAttribute* dataAttribute)
{
call_Lib_daObserverCallback(mod, dataAttribute);
}
}2. C 调用 C++ 语言
在C语言的函数中是无法直接调用C++代码的,如果要调用,需要做一个wrapper,例如call_Lib_daObserverCallback,它的声明和实现如下:
1 2 3 4 | extern "C" void call_Lib_daObserverCallback(Lib* p, DataAttribute* dataAttribute) // wrapper function { p->daObserverCallback(dataAttribute); } |
extern "C" void call_Lib_daObserverCallback(Lib* p, DataAttribute* dataAttribute) // wrapper function
{
p->daObserverCallback(dataAttribute);
}daObserverCallback 才是我们C++代码的实现:
1 2 3 4 5 | void Lib::daObserverCallback(DataAttribute* dataAttribute) { map<string, MMSINFO>::iterator it; // ... } |
void Lib::daObserverCallback(DataAttribute* dataAttribute)
{
map<string, MMSINFO>::iterator it;
// ...
}




能坚持写博客,至少也是个有恒心的人,赞一个
癸巳年(蛇)八月廿一 2013-9-25