现在的位置: 首页 > 程序设计> 正文
备忘:C与C++之间的互相调用
2013年09月20日 程序设计 评论数 1 ⁄ 被围观 6,721+

最新在做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;
  // ...
}
【上篇】
【下篇】

目前有 1 条留言 其中:访客:1 条, 博主:0 条

  1. www.356688.com : 2013年09月25日12:23:47  -49楼 @回复 回复

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

给我留言

留言无头像?


×
腾讯微博