最新在做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