martin

thinking

常用链接

统计

software

最新评论

C/C++混合编程

前段时间,碰到了C,C++混合编程的需求,经过努力,顺利解决问题.现把这方面的知识做一下简单的总结:
 
1.当C++文件要用到C语言中的函数代码时,采用下属方法即可:
在C++中的.h文件或.cpp文件中加入下列代码,
#define LINT_ARGS 1
extern "C" {
#include "system.h"
}
 
然后在代码中直接调用这些函数即可.

注解:
1.1 LINT_ARGS 1表示在检查C语言中的函数原型时,要对函数原型的参数进行检查. 
1.2. "{ }" 中包含的头文件为C语言中的头文件.
1.3.extern "C" 告诉链接器,这些头文件中的函数被当做C语言中的函数来处理.
 
下面以一个实例加以说明:
下面为一个C语言的头文件(sysgct.h):
#ifdef LINT_ARGS
  int  GCT_send(unsigned int task_id, HDR *h);
  ......
#else
  int  GCT_send();
  ......
#endif
~
in file MapBaseReq.cpp 文件中
#include ....
extern "C"
{
#include "sysgct.h"
}
void
MapBaseReq::sendPdu(const BasePdu_var& thePduP)
{
    ...
    if (GCT_send(m->hdr.dst, (HDR *)m) != 0)
        {
                relm((HDR *)m);
                SETERR1(errSWErrorMsg, "sendPdu(): GCT_send() Failed");
        }
   ...
}
 
2.当C文件要用到C++语言某个类中的方法时,可以采用下列方法:
2.1 在cpp文件中用下列方式定义函数:
extern "C" returnType FunName(parameters list).
 
2.2 然后在相应的头文件中进行声明:
extern returnType FunName(parameters list);
 
2.3 在相应的.c文件中包含该头文件,然后直接利用相应的函数即可.
 
下面给出实例.
 
2.4 cpp文件

#include <iostream>
#include <iomanip>
#include "TTDebug.h"
using namespace std;

extern "C"
{
#include "Utility.h"
}

static int display_hex_buffer(unsigned char* buffer, unsigned char* ptr,int len);

extern "C" void tDebug_traceFunc(int level, char* trace)
{
        TDEBUG_TRACEFUNC(level,trace);
}

extern "C" void nDebug(int level, unsigned char* args, int iLen, int cid)
{
        unsigned char buf[512];
        if(0 != TTDebug::instance() && TTDebug::instance()->isTTDebugOn(level))
        {
                /* Check whether the current thread already holds the mutex lock */
                LockGuard<MutexWrapper> guard(TTDebug::instance()->mutex());
                TTDebug::instance()->traceStart(level, __FILE__, __LINE__);
                memset(buf,0,512);
                display_hex_buffer(buf,args,iLen);
                TTDebug::instance()->outStream() << "Send Msg(0-0x" << setw(4) << setfill('0') << hex << cid <<"):0x" << buf;
                TTDebug::instance()->traceEnd();
        }
}

2.5 .h 文件

#ifndef __UTILITY_H
#define __UTILITY_H

extern void tDebug_traceFunc(int level, char* trace);
extern void nDebug(int level, unsigned char* args,int iLen, int cid);

#endif
 
2.6 cpp文件中定义的函数在c文件中调用实例
在test.c文件中:

...

int ctu_ent(msg,pInt)
  MSG* msg;
  int *pInt;
{

 tDebug_traceFunc(10,"ctu ctu_ent");

  HDR *h;
  MSG *m;

   ...

}

...


posted on 2009-03-03 16:25 martin_yahoo 阅读(4385) 评论(3)  编辑 收藏 引用

评论

# re: C/C++混合编程 2009-03-03 20:44 梦在天涯

不错!很有用
在《C++编程思想》中有提到
extern "C"
{
#include "Utility.h"
}!  回复  更多评论   

# re: C/C++混合编程 2009-03-05 22:46 cdy20


c+上c头文件名,也可以
比如#include<cstdio>........  回复  更多评论   

# re: C/C++混合编程[未登录] 2009-03-05 23:20 martin_yahoo

@cdy20
只不过是在c头文件中已经加上了如下类似的语句:
#ifdef _c_plus_plus
extern "C"{
#endif
.....
#ifdef _c_plus_plus
}
#endif

如果在c语言的头文件中加上述语句, 就应象采用随笔中提到的做法.
  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理