C/C++混合编程

 [zz] http://www.cppblog.com/martin/archive/2009/03/03/yfx.html

前段时间,碰到了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;

   ...

}

...

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值